Mercurial > cpython-lru_cache-weakref
annotate Include/objimpl.h @ 13778:f6e4a9dd67cd legacy-trunk
Rename the "parser" package to "parsers" to be compatible with the PyXML
project.
| author | Fred Drake <fdrake@acm.org> |
|---|---|
| date | Mon, 31 Jul 2000 23:59:54 +0000 |
| parents | 33df3b516711 |
| children | ed369f0aa32b |
| rev | line source |
|---|---|
| 145 | 1 /*********************************************************** |
|
13255
916fb024ce94
Change copyright notice.
Guido van Rossum <guido@python.org>
parents:
13183
diff
changeset
|
2 Copyright (c) 2000, BeOpen.com. |
|
916fb024ce94
Change copyright notice.
Guido van Rossum <guido@python.org>
parents:
13183
diff
changeset
|
3 Copyright (c) 1995-2000, Corporation for National Research Initiatives. |
|
916fb024ce94
Change copyright notice.
Guido van Rossum <guido@python.org>
parents:
13183
diff
changeset
|
4 Copyright (c) 1990-1995, Stichting Mathematisch Centrum. |
|
916fb024ce94
Change copyright notice.
Guido van Rossum <guido@python.org>
parents:
13183
diff
changeset
|
5 All rights reserved. |
| 145 | 6 |
|
13255
916fb024ce94
Change copyright notice.
Guido van Rossum <guido@python.org>
parents:
13183
diff
changeset
|
7 See the file "Misc/COPYRIGHT" for information on usage and |
|
916fb024ce94
Change copyright notice.
Guido van Rossum <guido@python.org>
parents:
13183
diff
changeset
|
8 redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
| 145 | 9 ******************************************************************/ |
| 10 | |
|
13445
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
11 #ifndef Py_OBJIMPL_H |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
12 #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
|
13 |
|
33df3b516711
patch from Vladimir (move Py_Mem* interface to Include/pymem.h)
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
13761
diff
changeset
|
14 #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
|
15 |
|
13445
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
16 #ifdef __cplusplus |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
17 extern "C" { |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
18 #endif |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
19 |
| 6 | 20 /* |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
21 Functions and macros for modules that implement new object types. |
| 6 | 22 You must first include "object.h". |
| 23 | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
24 - PyObject_New(type, typeobj) allocates memory for a new object of |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
25 the given type; here 'type' must be the C structure type used to |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
26 represent the object and 'typeobj' the address of the corresponding |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
27 type object. Reference count and type pointer are filled in; the |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
28 rest of the bytes of the object are *undefined*! The resulting |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
29 expression type is 'type *'. The size of the object is actually |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
30 determined by the tp_basicsize field of the type object. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
31 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
32 - PyObject_NewVar(type, typeobj, n) is similar but allocates a |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
33 variable-size object with n extra items. The size is computed as |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
34 tp_basicsize plus n * tp_itemsize. This fills in the ob_size field |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
35 as well. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
36 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
37 - PyObject_Del(op) releases the memory allocated for an object. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
38 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
39 - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) are |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
40 similar to PyObject_{New, NewVar} except that they don't allocate |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
41 the memory needed for an object. Instead of the 'type' parameter, |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
42 they accept the pointer of a new object (allocated by an arbitrary |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
43 allocator) and initialize its object header fields. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
44 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
45 Note that objects created with PyObject_{New, NewVar} are allocated |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
46 within the Python heap by an object allocator, the latter being |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
47 implemented (by default) on top of the Python raw memory |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
48 allocator. This ensures that Python keeps control on the user's |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
49 objects regarding their memory management; for instance, they may be |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
50 subject to automatic garbage collection. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
51 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
52 In case a specific form of memory management is needed, implying that |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
53 the objects would not reside in the Python heap (for example standard |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
54 malloc heap(s) are mandatory, use of shared memory, C++ local storage |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
55 or operator new), you must first allocate the object with your custom |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
56 allocator, then pass its pointer to PyObject_{Init, InitVar} for |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
57 filling in its Python-specific fields: reference count, type pointer, |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
58 possibly others. You should be aware that Python has very limited |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
59 control over these objects because they don't cooperate with the |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
60 Python memory manager. Such objects may not be eligible for automatic |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
61 garbage collection and you have to make sure that they are released |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
62 accordingly whenever their destructor gets called (cf. the specific |
|
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 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
65 Unless you have specific memory management requirements, it is |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
66 recommended to use PyObject_{New, NewVar, Del}. */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
67 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
68 /* |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
69 * Core object memory allocator |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
70 * ============================ |
|
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 |
|
13488
b31311a78a5d
A small comment fix just to make sure I got my cvs/ssh setup right.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents:
13445
diff
changeset
|
73 /* The purpose of the object allocator is to make the distinction |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
74 between "object memory" and the rest within the Python heap. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
75 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
76 Object memory is the one allocated by PyObject_{New, NewVar}, i.e. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
77 the one that holds the object's representation defined by its C |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
78 type structure, *excluding* any object-specific memory buffers that |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
79 might be referenced by the structure (for type structures that have |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
80 pointer fields). By default, the object memory allocator is |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
81 implemented on top of the raw memory allocator. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
82 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
83 The PyCore_* macros can be defined to make the interpreter use a |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
84 custom object memory allocator. They are reserved for internal |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
85 memory management purposes exclusively. Both the core and extension |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
86 modules should use the PyObject_* API. */ |
| 6 | 87 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
88 #ifndef PyCore_OBJECT_MALLOC_FUNC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
89 #undef PyCore_OBJECT_REALLOC_FUNC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
90 #undef PyCore_OBJECT_FREE_FUNC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
91 #define PyCore_OBJECT_MALLOC_FUNC PyCore_MALLOC_FUNC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
92 #define PyCore_OBJECT_REALLOC_FUNC PyCore_REALLOC_FUNC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
93 #define PyCore_OBJECT_FREE_FUNC PyCore_FREE_FUNC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
94 #endif |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
95 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
96 #ifndef PyCore_OBJECT_MALLOC_PROTO |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
97 #undef PyCore_OBJECT_REALLOC_PROTO |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
98 #undef PyCore_OBJECT_FREE_PROTO |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
99 #define PyCore_OBJECT_MALLOC_PROTO PyCore_MALLOC_PROTO |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
100 #define PyCore_OBJECT_REALLOC_PROTO PyCore_REALLOC_PROTO |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
101 #define PyCore_OBJECT_FREE_PROTO PyCore_FREE_PROTO |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
102 #endif |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
103 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
104 #ifdef NEED_TO_DECLARE_OBJECT_MALLOC_AND_FRIEND |
|
13709
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13488
diff
changeset
|
105 extern void *PyCore_OBJECT_MALLOC_FUNC PyCore_OBJECT_MALLOC_PROTO; |
|
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13488
diff
changeset
|
106 extern void *PyCore_OBJECT_REALLOC_FUNC PyCore_OBJECT_REALLOC_PROTO; |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
107 extern void PyCore_OBJECT_FREE_FUNC PyCore_OBJECT_FREE_PROTO; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
108 #endif |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
109 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
110 #ifndef PyCore_OBJECT_MALLOC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
111 #undef PyCore_OBJECT_REALLOC |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
112 #undef PyCore_OBJECT_FREE |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
113 #define PyCore_OBJECT_MALLOC(n) PyCore_OBJECT_MALLOC_FUNC(n) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
114 #define PyCore_OBJECT_REALLOC(p, n) PyCore_OBJECT_REALLOC_FUNC((p), (n)) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
115 #define PyCore_OBJECT_FREE(p) PyCore_OBJECT_FREE_FUNC(p) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
116 #endif |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
117 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
118 /* |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
119 * Raw object memory interface |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
120 * =========================== |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
121 */ |
| 6 | 122 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
123 /* The use of this API should be avoided, unless a builtin object |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
124 constructor inlines PyObject_{New, NewVar}, either because the |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
125 latter functions cannot allocate the exact amount of needed memory, |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
126 either for speed. This situation is exceptional, but occurs for |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
127 some object constructors (PyBuffer_New, PyList_New...). Inlining |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
128 PyObject_{New, NewVar} for objects that are supposed to belong to |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
129 the Python heap is discouraged. If you really have to, make sure |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
130 the object is initialized with PyObject_{Init, InitVar}. Do *not* |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
131 inline PyObject_{Init, InitVar} for user-extension types or you |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
132 might seriously interfere with Python's memory management. */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
133 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
134 /* Functions */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
135 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
136 /* Wrappers around PyCore_OBJECT_MALLOC and friends; useful if you |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
137 need to be sure that you are using the same object memory allocator |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
138 as Python. These wrappers *do not* make sure that allocating 0 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
139 bytes returns a non-NULL pointer. Returned pointers must be checked |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
140 for NULL explicitly; no action is performed on failure. */ |
|
13709
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13488
diff
changeset
|
141 extern DL_IMPORT(void *) PyObject_Malloc(size_t); |
|
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13488
diff
changeset
|
142 extern DL_IMPORT(void *) PyObject_Realloc(void *, size_t); |
|
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13488
diff
changeset
|
143 extern DL_IMPORT(void) PyObject_Free(void *); |
|
12576
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 /* Macros */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
146 #define PyObject_MALLOC(n) PyCore_OBJECT_MALLOC(n) |
|
13709
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13488
diff
changeset
|
147 #define PyObject_REALLOC(op, n) PyCore_OBJECT_REALLOC((void *)(op), (n)) |
|
4e2aaf1e722a
Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents:
13488
diff
changeset
|
148 #define PyObject_FREE(op) PyCore_OBJECT_FREE((void *)(op)) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
149 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
150 /* |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
151 * Generic object allocator interface |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
152 * ================================== |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
153 */ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
154 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
155 /* Functions */ |
|
13445
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
156 extern DL_IMPORT(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
157 extern DL_IMPORT(PyVarObject *) PyObject_InitVar(PyVarObject *, |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
158 PyTypeObject *, int); |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
159 extern DL_IMPORT(PyObject *) _PyObject_New(PyTypeObject *); |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
160 extern DL_IMPORT(PyVarObject *) _PyObject_NewVar(PyTypeObject *, int); |
|
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
161 extern DL_IMPORT(void) _PyObject_Del(PyObject *); |
| 6 | 162 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
163 #define PyObject_New(type, typeobj) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
164 ( (type *) _PyObject_New(typeobj) ) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
165 #define PyObject_NewVar(type, typeobj, n) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
166 ( (type *) _PyObject_NewVar((typeobj), (n)) ) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
167 #define PyObject_Del(op) _PyObject_Del((PyObject *)(op)) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
168 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
169 /* Macros trading binary compatibility for speed. See also mymalloc.h. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
170 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
|
171 #define PyObject_INIT(op, typeobj) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
172 ( (op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
173 #define PyObject_INIT_VAR(op, typeobj, size) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
174 ( (op)->ob_size = (size), PyObject_INIT((op), (typeobj)) ) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
175 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
176 #define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
177 #define _PyObject_VAR_SIZE(typeobj, n) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
178 ( (typeobj)->tp_basicsize + (n) * (typeobj)->tp_itemsize ) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
179 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
180 #define PyObject_NEW(type, typeobj) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
181 ( (type *) PyObject_Init( \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
182 (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
183 #define PyObject_NEW_VAR(type, typeobj, n) \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
184 ( (type *) PyObject_InitVar( \ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
185 (PyVarObject *) PyObject_MALLOC( _PyObject_VAR_SIZE((typeobj),(n)) ),\ |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
186 (typeobj), (n)) ) |
|
1329
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
187 |
|
13265
e8bb0d536633
Neil Schemenauer: small fixes for GC
Guido van Rossum <guido@python.org>
parents:
13256
diff
changeset
|
188 #define PyObject_DEL(op) PyObject_FREE(op) |
|
e8bb0d536633
Neil Schemenauer: small fixes for GC
Guido van Rossum <guido@python.org>
parents:
13256
diff
changeset
|
189 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
190 /* 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
|
191 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
|
192 distinction between two steps (at least): |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
193 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
|
194 2) the initialization of the Python specific fields |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
195 in this storage with PyObject_{Init, InitVar}. |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
196 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
197 PyObject * |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
198 YourObject_New(...) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
199 { |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
200 PyObject *op; |
| 3764 | 201 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
202 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
|
203 if (op == NULL) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
204 return PyErr_NoMemory(); |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
205 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
206 op = PyObject_Init(op, &YourTypeStruct); |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
207 if (op == NULL) |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
208 return NULL; |
| 3764 | 209 |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
210 op->ob_field = value; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
211 ... |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
212 return op; |
|
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 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
215 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
|
216 the 1st step is performed automatically for you, so in a C++ class |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11891
diff
changeset
|
217 constructor you would start directly with PyObject_Init/InitVar. */ |
| 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 |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
224 /* To make a new object participate in garbage collection use |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
225 PyObject_{New, VarNew, Del} to manage the memory. Set the type flag |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
226 Py_TPFLAGS_GC and define the type method tp_recurse. You should also |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
227 add the method tp_clear if your object is mutable. Include |
|
13265
e8bb0d536633
Neil Schemenauer: small fixes for GC
Guido van Rossum <guido@python.org>
parents:
13256
diff
changeset
|
228 PyGC_HEAD_SIZE in the calculation of tp_basicsize. Call |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
229 PyObject_GC_Init after the pointers followed by tp_recurse become |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
230 valid (usually just before returning the object from the allocation |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
231 method. Call PyObject_GC_Fini before those pointers become invalid |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
232 (usually at the top of the deallocation method). */ |
|
12993
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
233 |
|
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
234 #ifndef WITH_CYCLE_GC |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
235 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
236 #define PyGC_HEAD_SIZE 0 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
237 #define PyObject_GC_Init(op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
238 #define PyObject_GC_Fini(op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
239 #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
|
240 #define PyObject_FROM_GC(op) (op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
241 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
242 #else |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
243 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
244 /* Add the object into the container set */ |
|
13445
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
245 extern DL_IMPORT(void) _PyGC_Insert(PyObject *); |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
246 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
247 /* Remove the object from the container set */ |
|
13445
091ca6b9348f
ANSI-fication and Py_PROTO extermination.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
248 extern DL_IMPORT(void) _PyGC_Remove(PyObject *); |
|
13183
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
249 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
250 #define PyObject_GC_Init(op) _PyGC_Insert((PyObject *)op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
251 #define PyObject_GC_Fini(op) _PyGC_Remove((PyObject *)op) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
252 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
253 /* Structure *prefixed* to container objects participating in GC */ |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
254 typedef struct _gc_head { |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
255 struct _gc_head *gc_next; |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
256 struct _gc_head *gc_prev; |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
257 int gc_refs; |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
258 } PyGC_Head; |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
259 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
260 #define PyGC_HEAD_SIZE sizeof(PyGC_Head) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
261 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
262 /* Test if a type has a GC head */ |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
263 #define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_GC) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
264 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
265 /* Test if an object has a GC head */ |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
266 #define PyObject_IS_GC(o) PyType_IS_GC((o)->ob_type) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
267 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
268 /* Get an object's GC head */ |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
269 #define PyObject_AS_GC(o) ((PyGC_Head *)(o)-1) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
270 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
271 /* Get the object given the PyGC_Head */ |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
272 #define PyObject_FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1)) |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
273 |
|
54bffdddc0ef
final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12993
diff
changeset
|
274 #endif /* WITH_CYCLE_GC */ |
|
12993
8f79c5b69e0a
part 2 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
275 |
|
1329
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
276 #ifdef __cplusplus |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
277 } |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
278 #endif |
|
519c25039c6a
* Added support for X11 modules.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
279 #endif /* !Py_OBJIMPL_H */ |
