Mercurial > cpython-lru_cache-weakref
annotate Include/objimpl.h @ 66978:aed2bbafa550 3.1
Blocked revisions 87324 via svnmerge
........
r87324 | r.david.murray | 2010-12-16 14:08:51 -0500 (Thu, 16 Dec 2010) | 9 lines
#10719: restore messages generated on invalid compileall args
Before the introduction of filename arguments to compileall it gave semi useful
messages about not being able to 'list' names that weren't valid directories.
This fix restores that behavior. In addition to the test for this case, the
patch also adds a test for the default behavior of compileall when no arguments
are provided, and fixes a bug in one of the previously added tests.
........
| author | R. David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Thu, 16 Dec 2010 19:10:16 +0000 |
| parents | f197407bdba2 |
| children | 3c9232a684ae |
| 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); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
111 #define PyObject_MALLOC _PyObject_DebugMalloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
112 #define PyObject_Malloc _PyObject_DebugMalloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
113 #define PyObject_REALLOC _PyObject_DebugRealloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
114 #define PyObject_Realloc _PyObject_DebugRealloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
115 #define PyObject_FREE _PyObject_DebugFree |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
116 #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
|
117 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
118 #else /* WITH_PYMALLOC && ! PYMALLOC_DEBUG */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
119 #define PyObject_MALLOC PyObject_Malloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
120 #define PyObject_REALLOC PyObject_Realloc |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
121 #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
|
122 #endif |
|
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
123 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
124 #else /* ! WITH_PYMALLOC */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
125 #define PyObject_MALLOC PyMem_MALLOC |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
126 #define PyObject_REALLOC PyMem_REALLOC |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
127 #define PyObject_FREE PyMem_FREE |
| 23297 | 128 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
129 #endif /* WITH_PYMALLOC */ |
|
22970
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 #define PyObject_Del PyObject_Free |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
132 #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
|
133 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
134 /* |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
135 * Generic object allocator interface |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
136 * ================================== |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
137 */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
138 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
139 /* Functions */ |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
140 PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
141 PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36415
diff
changeset
|
142 PyTypeObject *, Py_ssize_t); |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
143 PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36415
diff
changeset
|
144 PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); |
| 6 | 145 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
146 #define PyObject_New(type, typeobj) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
147 ( (type *) _PyObject_New(typeobj) ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
148 #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
|
149 ( (type *) _PyObject_NewVar((typeobj), (n)) ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
150 |
| 14006 | 151 /* 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
|
152 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
|
153 #define PyObject_INIT(op, typeobj) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
154 ( 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
|
155 #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
|
156 ( 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
|
157 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
158 #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
|
159 |
|
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
|
160 /* _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
|
161 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
|
162 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
|
163 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
|
164 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
|
165 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
|
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 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
|
168 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
|
169 */ |
|
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
|
170 #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
|
171 # 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
|
172 #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
|
173 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
174 #define _PyObject_VAR_SIZE(typeobj, nitems) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
175 (size_t) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
176 ( ( (typeobj)->tp_basicsize + \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
177 (nitems)*(typeobj)->tp_itemsize + \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
178 (SIZEOF_VOID_P - 1) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
179 ) & ~(SIZEOF_VOID_P - 1) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
180 ) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
181 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
182 #define PyObject_NEW(type, typeobj) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
183 ( (type *) PyObject_Init( \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
184 (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
|
185 |
|
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
|
186 #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
|
187 ( (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
|
188 (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
|
189 (typeobj), (n)) ) |
|
1329
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
190 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
191 /* 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
|
192 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
|
193 distinction between two steps (at least): |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
194 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
|
195 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
|
196 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
|
197 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
198 PyObject * |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
199 YourObject_New(...) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
200 { |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
201 PyObject *op; |
| 3764 | 202 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
203 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
|
204 if (op == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
205 return PyErr_NoMemory(); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
206 |
| 23297 | 207 PyObject_Init(op, &YourTypeStruct); |
| 3764 | 208 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
209 op->ob_field = value; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
210 ... |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
211 return op; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
212 } |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
213 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
214 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
|
215 the 1st step is performed automatically for you, so in a C++ class |
| 23297 | 216 constructor you would start directly with PyObject_Init/InitVar |
| 217 */ | |
| 3764 | 218 |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
219 /* |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
220 * Garbage Collection Support |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
221 * ========================== |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
222 */ |
|
12993
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
223 |
|
28651
7fda09f751ad
- New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents:
24752
diff
changeset
|
224 /* C equivalent of gc.collect(). */ |
|
36839
7c1aca8e3d7d
Make PyGC_Collect() use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36769
diff
changeset
|
225 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
|
226 |
|
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
|
227 /* 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
|
228 #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
|
229 |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
230 /* 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
|
231 #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
|
232 (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
|
233 |
|
36524
4c8606191c0c
Change _PyObject_GC_Resize to expect Py_ssize_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
234 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
|
235 #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
|
236 ( (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
|
237 |
|
22970
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
238 /* for source compatibility with 2.2 */ |
|
f93a26d1bfa0
Remove PyMalloc_* symbols. PyObject_Malloc now uses pymalloc if
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22632
diff
changeset
|
239 #define _PyObject_GC_Del PyObject_GC_Del |
|
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 |
| 23297 | 241 /* GC information is stored BEFORE the object structure. */ |
|
20381
b4f829941f3d
SF bug [#467145] Python 2.2a4 build problem on HPUX 11.0.
Tim Peters <tim.peters@gmail.com>
parents:
20296
diff
changeset
|
242 typedef union _gc_head { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
243 struct { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
244 union _gc_head *gc_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
245 union _gc_head *gc_prev; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
246 Py_ssize_t gc_refs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
247 } gc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
248 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
|
249 } 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
|
250 |
|
23378
4d6beab766e2
_PyGC_generation0 is now a pointer
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
23297
diff
changeset
|
251 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
|
252 |
|
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
|
253 #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
|
254 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
255 #define _PyGC_REFS_UNTRACKED (-2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
256 #define _PyGC_REFS_REACHABLE (-3) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
257 #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
|
258 |
|
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
|
259 /* 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
|
260 * 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
|
261 #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
|
262 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
|
263 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
|
264 Py_FatalError("GC object already tracked"); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
265 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
|
266 g->gc.gc_next = _PyGC_generation0; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
267 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
|
268 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
|
269 _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
|
270 } 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
|
271 |
|
24085
22d2f037af9d
Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents:
24077
diff
changeset
|
272 /* 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
|
273 * 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
|
274 * 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
|
275 */ |
|
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
|
276 #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
|
277 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
|
278 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
|
279 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
|
280 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
|
281 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
|
282 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
|
283 } while (0); |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
284 |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
285 /* 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
|
286 #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
|
287 ((_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
|
288 |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
289 /* 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
|
290 This can be useful to implement some optimizations. */ |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
291 #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
|
292 (PyObject_IS_GC(obj) && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
293 (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) |
|
52291
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
294 |
|
94bd0666ffa7
Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
44351
diff
changeset
|
295 |
|
24752
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
296 PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
297 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
|
298 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
|
299 PyAPI_FUNC(void) PyObject_GC_Track(void *); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
300 PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); |
|
c1eb668525e1
Excise DL_EXPORT from Include.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24121
diff
changeset
|
301 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
|
302 |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
303 #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
|
304 ( (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
|
305 #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
|
306 ( (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
|
307 |
|
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
|
308 |
|
32678
cada2e9b685c
Formalize that the Py_VISIT macro requires that the tp_traverse
Tim Peters <tim.peters@gmail.com>
parents:
32671
diff
changeset
|
309 /* 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
|
310 * 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
|
311 * "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
|
312 * 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
|
313 */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
314 #define Py_VISIT(op) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
315 do { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
316 if (op) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
317 int vret = visit((PyObject *)(op), arg); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
318 if (vret) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
319 return vret; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
320 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52291
diff
changeset
|
321 } while (0) |
|
32671
52beafd936c8
Documented the new Py_VISIT macro to simplify implementation of
Jim Fulton <jim@zope.com>
parents:
28651
diff
changeset
|
322 |
|
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
|
323 /* This is here for the sake of backwards compatibility. Extensions that |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
324 * use the old GC API will still compile but the objects will not be |
|
fbd49d1717c4
Change the GC type flag since the API has changed. Allow types using
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
18956
diff
changeset
|
325 * tracked by the GC. */ |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
326 #define PyGC_HEAD_SIZE 0 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
327 #define PyObject_GC_Init(op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
328 #define PyObject_GC_Fini(op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
329 #define PyObject_AS_GC(op) (op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
330 #define PyObject_FROM_GC(op) (op) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17154
diff
changeset
|
331 |
|
12993
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
332 |
|
16385
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
16196
diff
changeset
|
333 /* 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
|
334 #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
|
335 |
|
1fb6672b20ef
PEP 205, Weak References -- initial checkin.
Fred Drake <fdrake@acm.org>
parents:
16196
diff
changeset
|
336 #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
|
337 ((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
|
338 |
|
1329
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
339 #ifdef __cplusplus |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
340 } |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
341 #endif |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
342 #endif /* !Py_OBJIMPL_H */ |
