https://github.com/python/cpython/commit/bcda8f1d42a98d9022736dd52d855be8e22... commit: bcda8f1d42a98d9022736dd52d855be8e220fe15 branch: master author: Victor Stinner <vstinner@redhat.com> committer: GitHub <noreply@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