Mercurial > cpython-lru_cache-weakref
annotate Include/objimpl.h @ 73323:dad02a080bbc
Improve byte-compilation in packaging to be independent of -O or -B.
The code I fixed to comply with PEP 3147 still had one bug: When run
under python -O, some paths for pyc files would be pyo, because I called
imp.cache_from_source without explicit debug_override argument in some
places, and under -O that would return .pyo (this is well explained in
the imp docs). Now all code (util.byte_compile, build_py, install_lib)
can create .pyo files according to options given by users,
without interference from the calling Python’s own optimize mode.
On a related topic, I also removed the code that prevented byte
compilation under python -B. The rationale is that packaging gives
control over the creation of pyc files to the user with its own explicit
option, and the behavior should not be changed if the calling Python
happens to run with -B for whatever reason. I will argue that this is a
bug fix and ask to be allowed to backport this change to distutils.
Finally, I moved one nugget of information about the --compile and
--optimize options from the source into the doc. It clears up a
misunderstanding that I (and maybe other people) had.
| author | Éric Araujo <merwok@netwok.org> |
|---|---|
| date | Thu, 03 Nov 2011 05:08:28 +0100 |
| parents | 3c9232a684ae |
| children | d63a80abfbec |
| rev | line source |
|---|---|
| 23297 | 1 /* The PyObject_ memory family: high-level object memory interfaces. |
| 2 See pymem.h for the low-level PyMem_ family. | |
| 3 */ | |
| 145 | 4 |
|
13445
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
5 #ifndef Py_OBJIMPL_H |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
6 #define Py_OBJIMPL_H |
|
13776
33df3b516711
patch from Vladimir (move Py_Mem* interface to Include/pymem.h)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13761
diff
changeset
|
7 |
|
33df3b516711
patch from Vladimir (move Py_Mem* interface to Include/pymem.h)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13761
diff
changeset
|
8 #include "pymem.h" |
|
33df3b516711
patch from Vladimir (move Py_Mem* interface to Include/pymem.h)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13761
diff
changeset
|
9 |
|
13445
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
10 #ifdef __cplusplus |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
11 extern "C" { |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
12 #endif |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
13 |
| 23297 | 14 /* BEWARE: |
| 15 | |
| 16 Each interface exports both functions and macros. Extension modules should | |
| 17 use the functions, to ensure binary compatibility across Python versions. | |
| 18 Because the Python implementation is free to change internal details, and | |
| 19 the macros may (or may not) expose details for speed, if you do use the | |
| 20 macros you must recompile your extensions with each Python release. | |
| 21 | |
| 22 Never mix calls to PyObject_ memory functions with calls to the platform | |
| 23 malloc/realloc/ calloc/free, or with calls to PyMem_. | |
| 24 */ | |
| 25 | |
| 6 | 26 /* |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
27 Functions and macros for modules that implement new object types. |
| 6 | 28 |
| 23297 | 29 - PyObject_New(type, typeobj) allocates memory for a new object of the given |
| 30 type, and initializes part of it. 'type' must be the C structure type used | |
| 31 to represent the object, and 'typeobj' the address of the corresponding | |
| 32 type object. Reference count and type pointer are filled in; the rest of | |
| 33 the bytes of the object are *undefined*! The resulting expression type is | |
| 34 'type *'. The size of the object is determined by the tp_basicsize field | |
| 35 of the type object. | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
36 |
| 23297 | 37 - PyObject_NewVar(type, typeobj, n) is similar but allocates a variable-size |
| 38 object with room for n items. In addition to the refcount and type pointer | |
| 39 fields, this also fills in the ob_size field. | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
40 |
| 23297 | 41 - PyObject_Del(op) releases the memory allocated for an object. It does not |
| 42 run a destructor -- it only frees the memory. PyObject_Free is identical. | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
43 |
| 23297 | 44 - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't |
| 45 allocate memory. Instead of a 'type' parameter, they take a pointer to a | |
| 46 new object (allocated by an arbitrary allocator), and initialize its object | |
| 47 header fields. | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
48 |
| 23297 | 49 Note that objects created with PyObject_{New, NewVar} are allocated using the |
| 50 specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is | |
| 51 enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG | |
| 52 is also #defined. | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
53 |
| 23297 | 54 In case a specific form of memory management is needed (for example, if you |
| 55 must use the platform malloc heap(s), or shared memory, or C++ local storage or | |
| 56 operator new), you must first allocate the object with your custom allocator, | |
| 57 then pass its pointer to PyObject_{Init, InitVar} for filling in its Python- | |
| 58 specific fields: reference count, type pointer, possibly others. You should | |
| 59 be aware that Python no control over these objects because they don't | |
| 60 cooperate with the Python memory manager. Such objects may not be eligible | |
| 61 for automatic garbage collection and you have to make sure that they are | |
| 62 released accordingly whenever their destructor gets called (cf. the specific | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
63 form of memory management you're using). |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
64 |
| 23297 | 65 Unless you have specific memory management requirements, use |
| 66 PyObject_{New, NewVar, Del}. | |
| 67 */ | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
68 |
|
20294
426b379a138b
_PyObject_VAR_SIZE: always round up to a multiple-of-pointer-size value.
Tim Peters <tim.peters@gmail.com>
parents:
20293
diff
changeset
|
69 /* |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
70 * Raw object memory interface |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
71 * =========================== |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
72 */ |
| 6 | 73 |
|
22984
c5a67f50532e
First cut at repairing out-of-date comments; make alignment of macro defs
Tim Peters <tim.peters@gmail.com>
parents:
22970
diff
changeset
|
74 /* Functions to call the same malloc/realloc/free as used by Python's |
|
c5a67f50532e
First cut at repairing out-of-date comments; make alignment of macro defs
Tim Peters <tim.peters@gmail.com>
parents:
22970
diff
changeset
|
75 object allocator. If WITH_PYMALLOC is enabled, these may differ from |
|
c5a67f50532e
First cut at repairing out-of-date comments; make alignment of macro defs
Tim Peters <tim.peters@gmail.com>
parents:
22970
diff
changeset
|
76 the platform malloc/realloc/free. The Python object allocator is |
|
c5a67f50532e
First cut at repairing out-of-date comments; make alignment of macro defs
Tim Peters <tim.peters@gmail.com>
parents:
22970
diff
changeset
|
77 designed for fast, cache-conscious allocation of many "small" objects, |
| 23297 | 78 and with low hidden memory overhead. |
| 79 | |
| 80 PyObject_Malloc(0) returns a unique non-NULL pointer if possible. | |
| 81 | |
| 82 PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n). | |
| 83 PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory | |
| 84 at p. | |
| 85 | |
| 86 Returned pointers must be checked for NULL explicitly; no action is | |
| 87 performed on failure other than to return NULL (no warning it printed, no | |
| 88 exception is set, etc). | |
| 89 | |
| 90 For allocating objects, use PyObject_{New, NewVar} instead whenever | |
| 91 possible. The PyObject_{Malloc, Realloc, Free} family is exposed | |
| 92 so that you can exploit Python's small-block allocator for non-object | |
| 93 uses. If you must use these routines to allocate object memory, make sure | |
| 94 the object gets initialized via PyObject_{Init, InitVar} after obtaining | |
| 95 the raw memory. | |
| 96 */ | |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
97 PyAPI_FUNC(void *) PyObject_Malloc(size_t); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
98 PyAPI_FUNC(void *) PyObject_Realloc(void *, size_t); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
99 PyAPI_FUNC(void) PyObject_Free(void *); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
100 |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
101 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
102 /* Macros */ |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
103 #ifdef WITH_PYMALLOC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
104 #ifdef PYMALLOC_DEBUG /* WITH_PYMALLOC && PYMALLOC_DEBUG */ |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
105 PyAPI_FUNC(void *) _PyObject_DebugMalloc(size_t nbytes); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
106 PyAPI_FUNC(void *) _PyObject_DebugRealloc(void *p, size_t nbytes); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
107 PyAPI_FUNC(void) _PyObject_DebugFree(void *p); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
108 PyAPI_FUNC(void) _PyObject_DebugDumpAddress(const void *p); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
109 PyAPI_FUNC(void) _PyObject_DebugCheckAddress(const void *p); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
110 PyAPI_FUNC(void) _PyObject_DebugMallocStats(void); |
|
56256
b6aff7a59803
http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
52291
diff
changeset
|
111 PyAPI_FUNC(void *) _PyObject_DebugMallocApi(char api, size_t nbytes); |
|
b6aff7a59803
http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
52291
diff
changeset
|
112 PyAPI_FUNC(void *) _PyObject_DebugReallocApi(char api, void *p, size_t nbytes); |
|
b6aff7a59803
http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
52291
diff
changeset
|
113 PyAPI_FUNC(void) _PyObject_DebugFreeApi(char api, void *p); |
|
b6aff7a59803
http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
52291
diff
changeset
|
114 PyAPI_FUNC(void) _PyObject_DebugCheckAddressApi(char api, const void *p); |
|
b6aff7a59803
http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
52291
diff
changeset
|
115 PyAPI_FUNC(void *) _PyMem_DebugMalloc(size_t nbytes); |
|
b6aff7a59803
http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
52291
diff
changeset
|
116 PyAPI_FUNC(void *) _PyMem_DebugRealloc(void *p, size_t nbytes); |
|
b6aff7a59803
http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
52291
diff
changeset
|
117 PyAPI_FUNC(void) _PyMem_DebugFree(void *p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
118 #define PyObject_MALLOC _PyObject_DebugMalloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
119 #define PyObject_Malloc _PyObject_DebugMalloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
120 #define PyObject_REALLOC _PyObject_DebugRealloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
121 #define PyObject_Realloc _PyObject_DebugRealloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
122 #define PyObject_FREE _PyObject_DebugFree |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
123 #define PyObject_Free _PyObject_DebugFree |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
124 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
125 #else /* WITH_PYMALLOC && ! PYMALLOC_DEBUG */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
126 #define PyObject_MALLOC PyObject_Malloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
127 #define PyObject_REALLOC PyObject_Realloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
128 #define PyObject_FREE PyObject_Free |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
129 #endif |
|
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
130 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
131 #else /* ! WITH_PYMALLOC */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
132 #define PyObject_MALLOC PyMem_MALLOC |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
133 #define PyObject_REALLOC PyMem_REALLOC |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
134 #define PyObject_FREE PyMem_FREE |
| 23297 | 135 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
136 #endif /* WITH_PYMALLOC */ |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
137 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
138 #define PyObject_Del PyObject_Free |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
139 #define PyObject_DEL PyObject_FREE |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
140 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
141 /* |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
142 * Generic object allocator interface |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
143 * ================================== |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
144 */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
145 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
146 /* Functions */ |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
147 PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
148 PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36415
diff
changeset
|
149 PyTypeObject *, Py_ssize_t); |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
150 PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36415
diff
changeset
|
151 PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); |
| 6 | 152 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
153 #define PyObject_New(type, typeobj) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
154 ( (type *) _PyObject_New(typeobj) ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
155 #define PyObject_NewVar(type, typeobj, n) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
156 ( (type *) _PyObject_NewVar((typeobj), (n)) ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
157 |
| 14006 | 158 /* Macros trading binary compatibility for speed. See also pymem.h. |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
159 Note that these macros expect non-NULL object pointers.*/ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
160 #define PyObject_INIT(op, typeobj) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
161 ( Py_TYPE(op) = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
162 #define PyObject_INIT_VAR(op, typeobj, size) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
163 ( Py_SIZE(op) = (size), PyObject_INIT((op), (typeobj)) ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
164 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
165 #define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) |
|
20294
426b379a138b
_PyObject_VAR_SIZE: always round up to a multiple-of-pointer-size value.
Tim Peters <tim.peters@gmail.com>
parents:
20293
diff
changeset
|
166 |
|
20296
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
167 /* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
168 vrbl-size object with nitems items, exclusive of gc overhead (if any). The |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
169 value is rounded up to the closest multiple of sizeof(void *), in order to |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
170 ensure that pointer fields at the end of the object are correctly aligned |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
171 for the platform (this is of special importance for subclasses of, e.g., |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
172 str or long, so that pointers can be stored after the embedded data). |
|
20294
426b379a138b
_PyObject_VAR_SIZE: always round up to a multiple-of-pointer-size value.
Tim Peters <tim.peters@gmail.com>
parents:
20293
diff
changeset
|
173 |
|
20296
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
174 Note that there's no memory wastage in doing this, as malloc has to |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
175 return (at worst) pointer-aligned memory anyway. |
|
20294
426b379a138b
_PyObject_VAR_SIZE: always round up to a multiple-of-pointer-size value.
Tim Peters <tim.peters@gmail.com>
parents:
20293
diff
changeset
|
176 */ |
|
20296
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
177 #if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
178 # error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
179 #endif |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
180 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
181 #define _PyObject_VAR_SIZE(typeobj, nitems) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
182 (size_t) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
183 ( ( (typeobj)->tp_basicsize + \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
184 (nitems)*(typeobj)->tp_itemsize + \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
185 (SIZEOF_VOID_P - 1) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
186 ) & ~(SIZEOF_VOID_P - 1) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
187 ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
188 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
189 #define PyObject_NEW(type, typeobj) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
190 ( (type *) PyObject_Init( \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
191 (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) |
|
20294
426b379a138b
_PyObject_VAR_SIZE: always round up to a multiple-of-pointer-size value.
Tim Peters <tim.peters@gmail.com>
parents:
20293
diff
changeset
|
192 |
|
20296
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
193 #define PyObject_NEW_VAR(type, typeobj, n) \ |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
194 ( (type *) PyObject_InitVar( \ |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
195 (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ |
|
6cc0b48049ec
Guido suggests, and I agree, to insist that SIZEOF_VOID_P be a power of 2.
Tim Peters <tim.peters@gmail.com>
parents:
20294
diff
changeset
|
196 (typeobj), (n)) ) |
|
1329
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
197 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
198 /* This example code implements an object constructor with a custom |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
199 allocator, where PyObject_New is inlined, and shows the important |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
200 distinction between two steps (at least): |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
201 1) the actual allocation of the object storage; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
202 2) the initialization of the Python specific fields |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
203 in this storage with PyObject_{Init, InitVar}. |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
204 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
205 PyObject * |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
206 YourObject_New(...) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
207 { |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
208 PyObject *op; |
| 3764 | 209 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
210 op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
211 if (op == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
212 return PyErr_NoMemory(); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
213 |
| 23297 | 214 PyObject_Init(op, &YourTypeStruct); |
| 3764 | 215 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
216 op->ob_field = value; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
217 ... |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
218 return op; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
219 } |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
220 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
221 Note that in C++, the use of the new operator usually implies that |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
222 the 1st step is performed automatically for you, so in a C++ class |
| 23297 | 223 constructor you would start directly with PyObject_Init/InitVar |
| 224 */ | |
| 3764 | 225 |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
226 /* |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
227 * Garbage Collection Support |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
228 * ========================== |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
229 */ |
|
12993
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
230 |
|
28651
7fda09f751ad
- New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents:
24752
diff
changeset
|
231 /* C equivalent of gc.collect(). */ |
|
36839
7c1aca8e3d7d
Make PyGC_Collect() use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36769
diff
changeset
|
232 PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); |
|
28651
7fda09f751ad
- New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents:
24752
diff
changeset
|
233 |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
234 /* Test if a type has a GC head */ |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
235 #define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
236 |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
237 /* Test if an object has a GC head */ |
|
44351
86a2679dca46
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT.
Christian Heimes <christian@cheimes.de>
parents:
42673
diff
changeset
|
238 #define PyObject_IS_GC(o) (PyType_IS_GC(Py_TYPE(o)) && \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
239 (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
240 |
|
36524
4c8606191c0c
Change _PyObject_GC_Resize to expect Py_ssize_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
241 PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
242 #define PyObject_GC_Resize(type, op, n) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
243 ( (type *) _PyObject_GC_Resize((PyVarObject *)(op), (n)) ) |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
244 |
| 23297 | 245 /* GC information is stored BEFORE the object structure. */ |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
61466
diff
changeset
|
246 #ifndef Py_LIMITED_API |
|
20381
b4f829941f3d
SF bug [#467145] Python 2.2a4 build problem on HPUX 11.0.
Tim Peters <tim.peters@gmail.com>
parents:
20296
diff
changeset
|
247 typedef union _gc_head { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
248 struct { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
249 union _gc_head *gc_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
250 union _gc_head *gc_prev; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
251 Py_ssize_t gc_refs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
252 } gc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
253 long double dummy; /* force worst-case alignment */ |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
254 } PyGC_Head; |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
255 |
|
23378
4d6beab766e2
_PyGC_generation0 is now a pointer
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
23297
diff
changeset
|
256 extern PyGC_Head *_PyGC_generation0; |
|
12993
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
257 |
|
22632
349404426faa
Add _Py_AS_GC macro. It will be used by the trashcan code on object.c.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22444
diff
changeset
|
258 #define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) |
|
349404426faa
Add _Py_AS_GC macro. It will be used by the trashcan code on object.c.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22444
diff
changeset
|
259 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
260 #define _PyGC_REFS_UNTRACKED (-2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
261 #define _PyGC_REFS_REACHABLE (-3) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
262 #define _PyGC_REFS_TENTATIVELY_UNREACHABLE (-4) |
|
24077
a5162fd65c3d
Reserved another gc_refs value for untracked objects. Every live gc
Tim Peters <tim.peters@gmail.com>
parents:
23378
diff
changeset
|
263 |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
264 /* Tell the GC to track this object. NB: While the object is tracked the |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
265 * collector it must be safe to call the ob_traverse method. */ |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
266 #define _PyObject_GC_TRACK(o) do { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
267 PyGC_Head *g = _Py_AS_GC(o); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
268 if (g->gc.gc_refs != _PyGC_REFS_UNTRACKED) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
269 Py_FatalError("GC object already tracked"); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
270 g->gc.gc_refs = _PyGC_REFS_REACHABLE; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
271 g->gc.gc_next = _PyGC_generation0; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
272 g->gc.gc_prev = _PyGC_generation0->gc.gc_prev; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
273 g->gc.gc_prev->gc.gc_next = g; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
274 _PyGC_generation0->gc.gc_prev = g; \ |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
275 } while (0); |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
276 |
|
24085
22d2f037af9d
Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents:
24077
diff
changeset
|
277 /* Tell the GC to stop tracking this object. |
|
22d2f037af9d
Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents:
24077
diff
changeset
|
278 * gc_next doesn't need to be set to NULL, but doing so is a good |
|
22d2f037af9d
Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents:
24077
diff
changeset
|
279 * way to provoke memory errors if calling code is confused. |
|
22d2f037af9d
Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents:
24077
diff
changeset
|
280 */ |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
281 #define _PyObject_GC_UNTRACK(o) do { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
282 PyGC_Head *g = _Py_AS_GC(o); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
283 assert(g->gc.gc_refs != _PyGC_REFS_UNTRACKED); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
284 g->gc.gc_refs = _PyGC_REFS_UNTRACKED; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
285 g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
286 g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
287 g->gc.gc_next = NULL; \ |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
288 } while (0); |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
289 |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
290 /* True if the object is currently tracked by the GC. */ |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
291 #define _PyObject_GC_IS_TRACKED(o) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
292 ((_Py_AS_GC(o))->gc.gc_refs != _PyGC_REFS_UNTRACKED) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
293 |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
294 /* True if the object may be tracked by the GC in the future, or already is. |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
295 This can be useful to implement some optimizations. */ |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
296 #define _PyObject_GC_MAY_BE_TRACKED(obj) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
297 (PyObject_IS_GC(obj) && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
298 (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
61466
diff
changeset
|
299 #endif /* Py_LIMITED_API */ |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
300 |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
301 PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
302 PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36415
diff
changeset
|
303 PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
304 PyAPI_FUNC(void) PyObject_GC_Track(void *); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
305 PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
306 PyAPI_FUNC(void) PyObject_GC_Del(void *); |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
307 |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
308 #define PyObject_GC_New(type, typeobj) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
309 ( (type *) _PyObject_GC_New(typeobj) ) |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
310 #define PyObject_GC_NewVar(type, typeobj, n) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
311 ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
312 |
|
19577
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
313 |
|
32678
cada2e9b685c
Formalize that the Py_VISIT macro requires that the tp_traverse
Tim Peters <tim.peters@gmail.com>
parents:
32671
diff
changeset
|
314 /* Utility macro to help write tp_traverse functions. |
|
cada2e9b685c
Formalize that the Py_VISIT macro requires that the tp_traverse
Tim Peters <tim.peters@gmail.com>
parents:
32671
diff
changeset
|
315 * To use this macro, the tp_traverse function must name its arguments |
|
cada2e9b685c
Formalize that the Py_VISIT macro requires that the tp_traverse
Tim Peters <tim.peters@gmail.com>
parents:
32671
diff
changeset
|
316 * "visit" and "arg". This is intended to keep tp_traverse functions |
|
cada2e9b685c
Formalize that the Py_VISIT macro requires that the tp_traverse
Tim Peters <tim.peters@gmail.com>
parents:
32671
diff
changeset
|
317 * looking as much alike as possible. |
|
cada2e9b685c
Formalize that the Py_VISIT macro requires that the tp_traverse
Tim Peters <tim.peters@gmail.com>
parents:
32671
diff
changeset
|
318 */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
319 #define Py_VISIT(op) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
320 do { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
321 if (op) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
322 int vret = visit((PyObject *)(op), arg); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
323 if (vret) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
324 return vret; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
325 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
326 } while (0) |
|
32671
52beafd936c8
Documented the new Py_VISIT macro to simplify implementation of
Jim Fulton <jim@zope.com>
parents:
28651
diff
changeset
|
327 |
|
12993
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
328 |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
16196
diff
changeset
|
329 /* Test if a type supports weak references */ |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
330 #define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
16196
diff
changeset
|
331 |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
16196
diff
changeset
|
332 #define PyObject_GET_WEAKREFS_LISTPTR(o) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
333 ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
16196
diff
changeset
|
334 |
|
1329
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
335 #ifdef __cplusplus |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
336 } |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
337 #endif |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
338 #endif /* !Py_OBJIMPL_H */ |
