summaryrefslogtreecommitdiff
path: root/Include/objimpl.h
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-02-05 13:12:19 +0100
committerGitHub <noreply@github.com>2020-02-05 13:12:19 +0100
commitf58bd7c1693fe041f7296a5778d0a11287895648 (patch)
tree066423d4c91278ace5f1f9159436fc2917ed2af8 /Include/objimpl.h
parent0fa4f43db086ac3459811cca4ec5201ffbee694a (diff)
downloadcpython-git-f58bd7c1693fe041f7296a5778d0a11287895648.tar.gz
bpo-39542: Make PyObject_INIT() opaque in limited C API (GH-18363)
In the limited C API, PyObject_INIT() and PyObject_INIT_VAR() are now defined as aliases to PyObject_Init() and PyObject_InitVar() to make their implementation opaque. It avoids to leak implementation details in the limited C API. Exclude the following functions from the limited C API, move them from object.h to cpython/object.h: * _Py_NewReference() * _Py_ForgetReference() * _PyTraceMalloc_NewReference() * _Py_GetRefTotal()
Diffstat (limited to 'Include/objimpl.h')
-rw-r--r--Include/objimpl.h43
1 files changed, 12 insertions, 31 deletions
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 2337d8a56c..45919251f4 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -127,40 +127,21 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
#define PyObject_NewVar(type, typeobj, n) \
( (type *) _PyObject_NewVar((typeobj), (n)) )
-/* Inline functions trading binary compatibility for speed:
- PyObject_INIT() is the fast version of PyObject_Init(), and
- PyObject_INIT_VAR() is the fast version of PyObject_InitVar.
- See also pymem.h.
-
- These inline functions expect non-NULL object pointers. */
-static inline PyObject*
-_PyObject_INIT(PyObject *op, PyTypeObject *typeobj)
-{
- assert(op != NULL);
- Py_TYPE(op) = typeobj;
- if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) {
- Py_INCREF(typeobj);
- }
- _Py_NewReference(op);
- return op;
-}
-
-#define PyObject_INIT(op, typeobj) \
- _PyObject_INIT(_PyObject_CAST(op), (typeobj))
+#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize )
-static inline PyVarObject*
-_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size)
-{
- assert(op != NULL);
- Py_SIZE(op) = size;
- PyObject_INIT((PyObject *)op, typeobj);
- return op;
-}
-#define PyObject_INIT_VAR(op, typeobj, size) \
- _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size))
+#ifdef Py_LIMITED_API
+/* Define PyObject_INIT() and PyObject_INIT_VAR() as aliases to PyObject_Init()
+ and PyObject_InitVar() in the limited C API for compatibility with the
+ CPython C API. */
+# define PyObject_INIT(op, typeobj) \
+ PyObject_Init(_PyObject_CAST(op), (typeobj))
+# define PyObject_INIT_VAR(op, typeobj, size) \
+ PyObject_InitVar(_PyVarObject_CAST(op), (typeobj), (size))
+#else
+/* PyObject_INIT() and PyObject_INIT_VAR() are defined in cpython/objimpl.h */
+#endif
-#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize )
/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a
vrbl-size object with nitems items, exclusive of gc overhead (if any). The