[Python-checkins] bpo-35081: Add Include/internal/pycore_object.h (GH-10640)

Victor Stinner webhook-mailer at python.org
Wed Nov 21 16:27:52 EST 2018


https://github.com/python/cpython/commit/bcda8f1d42a98d9022736dd52d855be8e220fe15
commit: bcda8f1d42a98d9022736dd52d855be8e220fe15
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-11-21T22:27:47+01:00
summary:

bpo-35081: Add Include/internal/pycore_object.h (GH-10640)

Move _PyObject_GC_TRACK() and _PyObject_GC_UNTRACK() from
Include/objimpl.h to Include/internal/pycore_object.h.

files:
A Include/internal/pycore_object.h
M Include/objimpl.h
M Modules/_io/bufferedio.c
M Modules/_io/bytesio.c
M Modules/_io/fileio.c
M Modules/_io/iobase.c
M Modules/_io/stringio.c
M Modules/_io/textio.c
M Modules/_io/winconsoleio.c
M Modules/gcmodule.c
M Objects/bytearrayobject.c
M Objects/bytesobject.c
M Objects/call.c
M Objects/cellobject.c
M Objects/classobject.c
M Objects/descrobject.c
M Objects/dictobject.c
M Objects/exceptions.c
M Objects/frameobject.c
M Objects/funcobject.c
M Objects/genobject.c
M Objects/iterobject.c
M Objects/listobject.c
M Objects/memoryobject.c
M Objects/methodobject.c
M Objects/odictobject.c
M Objects/setobject.c
M Objects/sliceobject.c
M Objects/tupleobject.c
M Objects/typeobject.c
M Objects/unicodeobject.c
M Python/ceval.c
M Python/context.c
M Python/hamt.c

diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h
new file mode 100644
index 000000000000..a2638344b160
--- /dev/null
+++ b/Include/internal/pycore_object.h
@@ -0,0 +1,56 @@
+#ifndef Py_INTERNAL_OBJECT_H
+#define Py_INTERNAL_OBJECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
+#  error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN defined"
+#endif
+
+/* Tell the GC to track this object.
+ *
+ * NB: While the object is tracked by the collector, it must be safe to call the
+ * ob_traverse method.
+ *
+ * Internal note: _PyRuntime.gc.generation0->_gc_prev doesn't have any bit flags
+ * because it's not object header.  So we don't use _PyGCHead_PREV() and
+ * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations.
+ *
+ * The PyObject_GC_Track() function is the public version of this macro.
+ */
+#define _PyObject_GC_TRACK(o) do { \
+        PyGC_Head *g = _Py_AS_GC(o); \
+        if (g->_gc_next != 0) { \
+            Py_FatalError("GC object already tracked"); \
+        } \
+        assert((g->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0); \
+        PyGC_Head *last = (PyGC_Head*)(_PyRuntime.gc.generation0->_gc_prev); \
+        _PyGCHead_SET_NEXT(last, g); \
+        _PyGCHead_SET_PREV(g, last); \
+        _PyGCHead_SET_NEXT(g, _PyRuntime.gc.generation0); \
+        _PyRuntime.gc.generation0->_gc_prev = (uintptr_t)g; \
+    } while (0);
+
+/* Tell the GC to stop tracking this object.
+ *
+ * Internal note: This may be called while GC.  So _PyGC_PREV_MASK_COLLECTING must
+ * be cleared.  But _PyGC_PREV_MASK_FINALIZED bit is kept.
+ *
+ * The PyObject_GC_UnTrack() function is the public version of this macro.
+ */
+#define _PyObject_GC_UNTRACK(o) do { \
+        PyGC_Head *g = _Py_AS_GC(o); \
+        PyGC_Head *prev = _PyGCHead_PREV(g); \
+        PyGC_Head *next = _PyGCHead_NEXT(g); \
+        assert(next != NULL); \
+        _PyGCHead_SET_NEXT(prev, next); \
+        _PyGCHead_SET_PREV(next, prev); \
+        g->_gc_next = 0; \
+        g->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; \
+    } while (0);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_OBJECT_H */
diff --git a/Include/objimpl.h b/Include/objimpl.h
index b51b751b9c85..c455d4bebbdc 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -323,51 +323,6 @@ typedef struct {
     _PyGCHead_SET_FINALIZED(_Py_AS_GC(o))
 #endif   /* !defined(Py_LIMITED_API) */
 
-
-#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN)
-/* Tell the GC to track this object.
- *
- * NB: While the object is tracked by the collector, it must be safe to call the
- * ob_traverse method.
- *
- * Internal note: _PyRuntime.gc.generation0->_gc_prev doesn't have any bit flags
- * because it's not object header.  So we don't use _PyGCHead_PREV() and
- * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations.
- *
- * The PyObject_GC_Track() function is the public version of this macro.
- */
-#define _PyObject_GC_TRACK(o) do { \
-    PyGC_Head *g = _Py_AS_GC(o); \
-    if (g->_gc_next != 0) { \
-        Py_FatalError("GC object already tracked"); \
-    } \
-    assert((g->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0); \
-    PyGC_Head *last = (PyGC_Head*)(_PyRuntime.gc.generation0->_gc_prev); \
-    _PyGCHead_SET_NEXT(last, g); \
-    _PyGCHead_SET_PREV(g, last); \
-    _PyGCHead_SET_NEXT(g, _PyRuntime.gc.generation0); \
-    _PyRuntime.gc.generation0->_gc_prev = (uintptr_t)g; \
-    } while (0);
-
-/* Tell the GC to stop tracking this object.
- *
- * Internal note: This may be called while GC.  So _PyGC_PREV_MASK_COLLECTING must
- * be cleared.  But _PyGC_PREV_MASK_FINALIZED bit is kept.
- *
- * The PyObject_GC_UnTrack() function is the public version of this macro.
- */
-#define _PyObject_GC_UNTRACK(o) do { \
-    PyGC_Head *g = _Py_AS_GC(o); \
-    PyGC_Head *prev = _PyGCHead_PREV(g); \
-    PyGC_Head *next = _PyGCHead_NEXT(g); \
-    assert(next != NULL); \
-    _PyGCHead_SET_NEXT(prev, next); \
-    _PyGCHead_SET_PREV(next, prev); \
-    g->_gc_next = 0; \
-    g->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; \
-    } while (0);
-#endif   /* defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN) */
-
 #ifndef Py_LIMITED_API
 PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t size);
 PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size);
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index e1e45dc8fae0..6f855b9edd08 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -9,6 +9,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
 #include "pythread.h"
diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c
index a50add2389e5..8e54ec8e99c3 100644
--- a/Modules/_io/bytesio.c
+++ b/Modules/_io/bytesio.c
@@ -1,4 +1,5 @@
 #include "Python.h"
+#include "pycore_object.h"
 #include "structmember.h"       /* for offsetof() */
 #include "_iomodule.h"
 
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index ffcb73012953..c502c430134e 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -2,6 +2,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_object.h"
 #include "structmember.h"
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index 5b71732ef19c..9b063cd372fe 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -10,6 +10,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_object.h"
 #include "structmember.h"
 #include "_iomodule.h"
 
diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c
index 793fa1ee150b..bb5c3736a77a 100644
--- a/Modules/_io/stringio.c
+++ b/Modules/_io/stringio.c
@@ -2,6 +2,7 @@
 #include "Python.h"
 #include "structmember.h"
 #include "pycore_accu.h"
+#include "pycore_object.h"
 #include "_iomodule.h"
 
 /* Implementation note: the buffer is always at least one character longer
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 8924834eb81c..645d7123324c 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -8,6 +8,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_object.h"
 #include "structmember.h"
 #include "_iomodule.h"
 
diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c
index 148255c354a4..824690ff58d6 100644
--- a/Modules/_io/winconsoleio.c
+++ b/Modules/_io/winconsoleio.c
@@ -8,6 +8,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_object.h"
 
 #ifdef MS_WINDOWS
 
@@ -556,7 +557,7 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) {
     Py_BEGIN_ALLOW_THREADS
     DWORD off = 0;
     while (off < maxlen) {
-        DWORD n = (DWORD)-1; 
+        DWORD n = (DWORD)-1;
         DWORD len = min(maxlen - off, BUFSIZ);
         SetLastError(0);
         BOOL res = ReadConsoleW(handle, &buf[off], len, &n, NULL);
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 48b470006c4a..2cbf73866d12 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -25,6 +25,7 @@
 
 #include "Python.h"
 #include "pycore_context.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "frameobject.h"        /* for PyFrame_ClearFreeList */
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 561b06cdf967..144265381943 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -2,6 +2,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index fac12f55210e..bed75ee49e27 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -3,6 +3,7 @@
 #define PY_SSIZE_T_CLEAN
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 
diff --git a/Objects/call.c b/Objects/call.c
index 7c452b99d117..ce346c293486 100644
--- a/Objects/call.c
+++ b/Objects/call.c
@@ -1,4 +1,5 @@
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "frameobject.h"
 
diff --git a/Objects/cellobject.c b/Objects/cellobject.c
index 7605bcf7bc9b..6b7136c41270 100644
--- a/Objects/cellobject.c
+++ b/Objects/cellobject.c
@@ -1,6 +1,7 @@
 /* Cell object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 79b0562f7d5f..6d1f05ccd3a9 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -1,6 +1,7 @@
 /* Class object implementation (dead now except for methods) */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index ca814bf78a69..dd3c5014aea7 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1,6 +1,7 @@
 /* Descriptors -- a new, flexible way to describe attributes */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "structmember.h" /* Why is this not included in Python.h? */
 
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index df92bfd6a978..24561dd42c2e 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -111,6 +111,7 @@ converting the dict to the combined table.
 #define PyDict_MINSIZE 8
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "dict-common.h"
 #include "stringlib/eq.h"    /* to get unicode_eq() */
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index 5ab127111caf..cecbf977a327 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -6,6 +6,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include <Python.h>
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 70cf5807130e..b1a83d82a398 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -1,6 +1,7 @@
 /* Frame object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 
 #include "code.h"
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index a8e11a9a2d3d..982df5434d25 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -2,6 +2,7 @@
 /* Function object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "code.h"
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 716bd6d067bd..3279a0947e8f 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -1,6 +1,7 @@
 /* Generator object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "frameobject.h"
 #include "structmember.h"
diff --git a/Objects/iterobject.c b/Objects/iterobject.c
index 64bf92382be4..ada1bdc7e87e 100644
--- a/Objects/iterobject.c
+++ b/Objects/iterobject.c
@@ -1,6 +1,7 @@
 /* Iterator objects */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 44160abae6ee..6da8391fc275 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -1,6 +1,7 @@
 /* List object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "pycore_accu.h"
 
diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c
index 060ae4dd3cd0..0f528eec68bc 100644
--- a/Objects/memoryobject.c
+++ b/Objects/memoryobject.c
@@ -1,6 +1,7 @@
 /* Memoryview object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "pystrhex.h"
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index cfea8cf410d7..23325e2a1b3e 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -2,6 +2,7 @@
 /* Method object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
diff --git a/Objects/odictobject.c b/Objects/odictobject.c
index 13bc972039f3..bdd61080d18b 100644
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -465,6 +465,7 @@ Potential Optimizations
 */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
 #include "dict-common.h"
diff --git a/Objects/setobject.c b/Objects/setobject.c
index b11cb3a58696..c2a1467ba61a 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -32,6 +32,7 @@
 */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
 
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index 1f79faa3e6ca..c60483ea9494 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -14,6 +14,7 @@ this type and there is exactly one in existence.
 */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pymem.h"
 #include "pycore_pystate.h"
 #include "structmember.h"
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index e7ba09d71d33..83c63e089c3e 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -2,6 +2,7 @@
 /* Tuple object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "pycore_accu.h"
 
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 4d599bf51632..2345b7c07dc5 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -1,6 +1,7 @@
 /* Type object implementation */
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "frameobject.h"
 #include "structmember.h"
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 04ca5f334447..d22b277a51c8 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -41,6 +41,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #include "pycore_fileutils.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "ucnhash.h"
 #include "bytes_methods.h"
diff --git a/Python/ceval.c b/Python/ceval.c
index 9c0ab0663b14..7b2465592a4b 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -10,6 +10,7 @@
 #define PY_LOCAL_AGGRESSIVE
 
 #include "Python.h"
+#include "pycore_object.h"
 #include "pycore_pystate.h"
 
 #include "code.h"
diff --git a/Python/context.c b/Python/context.c
index b548ffee3bc0..302f7696bb6b 100644
--- a/Python/context.c
+++ b/Python/context.c
@@ -1,9 +1,10 @@
 #include "Python.h"
 
-#include "structmember.h"
-#include "pycore_pystate.h"
 #include "pycore_context.h"
 #include "pycore_hamt.h"
+#include "pycore_object.h"
+#include "pycore_pystate.h"
+#include "structmember.h"
 
 
 #define CONTEXT_FREELIST_MAXLEN 255
diff --git a/Python/hamt.c b/Python/hamt.c
index 3fe70b40fafc..d734d6ed07fb 100644
--- a/Python/hamt.c
+++ b/Python/hamt.c
@@ -1,8 +1,9 @@
 #include "Python.h"
 
-#include "structmember.h"
-#include "pycore_pystate.h"
 #include "pycore_hamt.h"
+#include "pycore_object.h"
+#include "pycore_pystate.h"
+#include "structmember.h"
 
 /*
 This file provides an implemention of an immutable mapping using the



More information about the Python-checkins mailing list