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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23297
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
1 /* The PyObject_ memory family: high-level object memory interfaces.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
2 See pymem.h for the low-level PyMem_ family.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
3 */
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
14 /* BEWARE:
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
15
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
16 Each interface exports both functions and macros. Extension modules should
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
17 use the functions, to ensure binary compatibility across Python versions.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
18 Because the Python implementation is free to change internal details, and
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
19 the macros may (or may not) expose details for speed, if you do use the
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
20 macros you must recompile your extensions with each Python release.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
21
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
22 Never mix calls to PyObject_ memory functions with calls to the platform
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
23 malloc/realloc/ calloc/free, or with calls to PyMem_.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
24 */
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
25
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
23297
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
29 - PyObject_New(type, typeobj) allocates memory for a new object of the given
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
30 type, and initializes part of it. 'type' must be the C structure type used
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
31 to represent the object, and 'typeobj' the address of the corresponding
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
32 type object. Reference count and type pointer are filled in; the rest of
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
33 the bytes of the object are *undefined*! The resulting expression type is
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
34 'type *'. The size of the object is determined by the tp_basicsize field
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
37 - PyObject_NewVar(type, typeobj, n) is similar but allocates a variable-size
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
38 object with room for n items. In addition to the refcount and type pointer
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
41 - PyObject_Del(op) releases the memory allocated for an object. It does not
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
44 - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
45 allocate memory. Instead of a 'type' parameter, they take a pointer to a
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
46 new object (allocated by an arbitrary allocator), and initialize its object
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
47 header fields.
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 11891
diff changeset
48
23297
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
49 Note that objects created with PyObject_{New, NewVar} are allocated using the
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
50 specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
51 enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
54 In case a specific form of memory management is needed (for example, if you
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
55 must use the platform malloc heap(s), or shared memory, or C++ local storage or
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
56 operator new), you must first allocate the object with your custom allocator,
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
57 then pass its pointer to PyObject_{Init, InitVar} for filling in its Python-
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
58 specific fields: reference count, type pointer, possibly others. You should
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
59 be aware that Python no control over these objects because they don't
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
60 cooperate with the Python memory manager. Such objects may not be eligible
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
61 for automatic garbage collection and you have to make sure that they are
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
65 Unless you have specific memory management requirements, use
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
66 PyObject_{New, NewVar, Del}.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
78 and with low hidden memory overhead.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
79
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
80 PyObject_Malloc(0) returns a unique non-NULL pointer if possible.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
81
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
82 PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n).
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
83 PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
84 at p.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
85
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
86 Returned pointers must be checked for NULL explicitly; no action is
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
87 performed on failure other than to return NULL (no warning it printed, no
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
88 exception is set, etc).
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
89
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
90 For allocating objects, use PyObject_{New, NewVar} instead whenever
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
91 possible. The PyObject_{Malloc, Realloc, Free} family is exposed
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
92 so that you can exploit Python's small-block allocator for non-object
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
93 uses. If you must use these routines to allocate object memory, make sure
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
94 the object gets initialized via PyObject_{Init, InitVar} after obtaining
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
95 the raw memory.
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
ed369f0aa32b Updated comment
Andrew M. Kuchling <amk@amk.ca>
parents: 13776
diff changeset
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
29fe6a0de366 Hacks for MS_COREDLL
Guido van Rossum <guido@python.org>
parents: 2305
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
214 PyObject_Init(op, &YourTypeStruct);
3764
29fe6a0de366 Hacks for MS_COREDLL
Guido van Rossum <guido@python.org>
parents: 2305
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
223 constructor you would start directly with PyObject_Init/InitVar
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
224 */
3764
29fe6a0de366 Hacks for MS_COREDLL
Guido van Rossum <guido@python.org>
parents: 2305
diff changeset
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
08e6f94f3ab0 Moving pymalloc along.
Tim Peters <tim.peters@gmail.com>
parents: 23020
diff changeset
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 */