]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35134: Create Include/cpython/listobject.h (GH-18395)
authorVictor Stinner <vstinner@python.org>
Fri, 7 Feb 2020 08:20:22 +0000 (09:20 +0100)
committerGitHub <noreply@github.com>
Fri, 7 Feb 2020 08:20:21 +0000 (09:20 +0100)
Move listobject.h code surrounded by "#ifndef Py_LIMITED_API"
to a new Include/cpython/listobject.h header file.

Add cpython/ header files to Makefile.pre.in and pythoncore project
of PCbuild.

Add _PyList_CAST() macro.

Include/cpython/listobject.h [new file with mode: 0644]
Include/listobject.h
Makefile.pre.in
PCbuild/pythoncore.vcxproj
PCbuild/pythoncore.vcxproj.filters

diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h
new file mode 100644 (file)
index 0000000..4b6f2f7
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef Py_CPYTHON_LISTOBJECT_H
+#  error "this header file must not be included directly"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+    PyObject_VAR_HEAD
+    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
+    PyObject **ob_item;
+
+    /* ob_item contains space for 'allocated' elements.  The number
+     * currently in use is ob_size.
+     * Invariants:
+     *     0 <= ob_size <= allocated
+     *     len(list) == ob_size
+     *     ob_item == NULL implies ob_size == allocated == 0
+     * list.sort() temporarily sets allocated to -1 to detect mutations.
+     *
+     * Items must normally not be NULL, except during construction when
+     * the list is not yet visible outside the function that builds it.
+     */
+    Py_ssize_t allocated;
+} PyListObject;
+
+PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *);
+PyAPI_FUNC(int) PyList_ClearFreeList(void);
+PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out);
+
+/* Macro, trading safety for speed */
+
+/* Cast argument to PyTupleObject* type. */
+#define _PyList_CAST(op) (assert(PyList_Check(op)), (PyListObject *)(op))
+
+#define PyList_GET_ITEM(op, i) (_PyList_CAST(op)->ob_item[i])
+#define PyList_SET_ITEM(op, i, v) (_PyList_CAST(op)->ob_item[i] = (v))
+#define PyList_GET_SIZE(op)    Py_SIZE(_PyList_CAST(op))
+#define _PyList_ITEMS(op)      (_PyList_CAST(op)->ob_item)
+
+#ifdef __cplusplus
+}
+#endif
index baf94152792ed424da4e72b1a55ef0f55b8ced7f..34dfcf92ec93ab889642e4809b4eee477c8285c7 100644 (file)
@@ -1,16 +1,14 @@
+/* List object interface
 
-/* List object interface */
+   Another generally useful object type is a list of object pointers.
+   This is a mutable type: the list items can be changed, and items can be
+   added or removed. Out-of-range indices or non-list objects are ignored.
 
-/*
-Another generally useful object type is a list of object pointers.
-This is a mutable type: the list items can be changed, and items can be
-added or removed.  Out-of-range indices or non-list objects are ignored.
-
-*** WARNING *** PyList_SetItem does not increment the new item's reference
-count, but does decrement the reference count of the item it replaces,
-if not nil.  It does *decrement* the reference count if it is *not*
-inserted in the list.  Similarly, PyList_GetItem does not increment the
-returned item's reference count.
+   WARNING: PyList_SetItem does not increment the new item's reference count,
+   but does decrement the reference count of the item it replaces, if not nil.
+   It does *decrement* the reference count if it is *not* inserted in the list.
+   Similarly, PyList_GetItem does not increment the returned item's reference
+   count.
 */
 
 #ifndef Py_LISTOBJECT_H
@@ -19,27 +17,6 @@ returned item's reference count.
 extern "C" {
 #endif
 
-#ifndef Py_LIMITED_API
-typedef struct {
-    PyObject_VAR_HEAD
-    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
-    PyObject **ob_item;
-
-    /* ob_item contains space for 'allocated' elements.  The number
-     * currently in use is ob_size.
-     * Invariants:
-     *     0 <= ob_size <= allocated
-     *     len(list) == ob_size
-     *     ob_item == NULL implies ob_size == allocated == 0
-     * list.sort() temporarily sets allocated to -1 to detect mutations.
-     *
-     * Items must normally not be NULL, except during construction when
-     * the list is not yet visible outside the function that builds it.
-     */
-    Py_ssize_t allocated;
-} PyListObject;
-#endif
-
 PyAPI_DATA(PyTypeObject) PyList_Type;
 PyAPI_DATA(PyTypeObject) PyListIter_Type;
 PyAPI_DATA(PyTypeObject) PyListRevIter_Type;
@@ -50,28 +27,23 @@ PyAPI_DATA(PyTypeObject) PyListRevIter_Type;
 
 PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size);
 PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *);
+
 PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t);
 PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *);
 PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *);
 PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *);
+
 PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t);
 PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *);
+
 PyAPI_FUNC(int) PyList_Sort(PyObject *);
 PyAPI_FUNC(int) PyList_Reverse(PyObject *);
 PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *);
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *);
-
-PyAPI_FUNC(int) PyList_ClearFreeList(void);
-PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out);
-#endif
 
-/* Macro, trading safety for speed */
 #ifndef Py_LIMITED_API
-#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i])
-#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v))
-#define PyList_GET_SIZE(op)    (assert(PyList_Check(op)),Py_SIZE(op))
-#define _PyList_ITEMS(op)      (((PyListObject *)(op))->ob_item)
+#  define Py_CPYTHON_LISTOBJECT_H
+#  include  "cpython/listobject.h"
+#  undef Py_CPYTHON_LISTOBJECT_H
 #endif
 
 #ifdef __cplusplus
index d430dc30bb6deaca5d2b580f6fb9e45680d8b4e7..510f227ed4df3a37d8a2da8fb8573488af5e7336 100644 (file)
@@ -1063,6 +1063,7 @@ PYTHON_HEADERS= \
                $(srcdir)/Include/cpython/import.h \
                $(srcdir)/Include/cpython/initconfig.h \
                $(srcdir)/Include/cpython/interpreteridobject.h \
+               $(srcdir)/Include/cpython/listobject.h \
                $(srcdir)/Include/cpython/object.h \
                $(srcdir)/Include/cpython/objimpl.h \
                $(srcdir)/Include/cpython/pyerrors.h \
index cfab2fa4e189c0a191a1e51726d03c79e952c10f..36a27f467405d5e614f0640f80afb9530a932953 100644 (file)
     <ClInclude Include="..\Include\cpython\fileobject.h" />
     <ClInclude Include="..\Include\cpython\import.h" />
     <ClInclude Include="..\Include\cpython\initconfig.h" />
+    <ClInclude Include="..\Include\cpython\listobject.h" />
     <ClInclude Include="..\Include\cpython\object.h" />
     <ClInclude Include="..\Include\cpython\objimpl.h" />
     <ClInclude Include="..\Include\cpython\pyerrors.h" />
index ba1839f8a3814ac57c51cb7077770f2576ee7bf3..0301557b3e50d9ad3ca183e3c2c557ada07844ae 100644 (file)
@@ -99,6 +99,9 @@
     <ClInclude Include="..\Include\cpython\initconfig.h">
       <Filter>Include</Filter>
     </ClInclude>
+    <ClInclude Include="..\Include\cpython\listobject.h">
+      <Filter>Include</Filter>
+    </ClInclude>
     <ClInclude Include="..\Include\cpython\object.h">
       <Filter>Include</Filter>
     </ClInclude>