Files for 2.1b1 distribution.
[python/dscho.git] / Include / objimpl.h
blob4197bde3e18bd6b0cd2da109bc9bf031530e6c67
2 #ifndef Py_OBJIMPL_H
3 #define Py_OBJIMPL_H
5 #include "pymem.h"
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
12 Functions and macros for modules that implement new object types.
13 You must first include "object.h".
15 - PyObject_New(type, typeobj) allocates memory for a new object of
16 the given type; here 'type' must be the C structure type used to
17 represent the object and 'typeobj' the address of the corresponding
18 type object. Reference count and type pointer are filled in; the
19 rest of the bytes of the object are *undefined*! The resulting
20 expression type is 'type *'. The size of the object is actually
21 determined by the tp_basicsize field of the type object.
23 - PyObject_NewVar(type, typeobj, n) is similar but allocates a
24 variable-size object with n extra items. The size is computed as
25 tp_basicsize plus n * tp_itemsize. This fills in the ob_size field
26 as well.
28 - PyObject_Del(op) releases the memory allocated for an object.
30 - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) are
31 similar to PyObject_{New, NewVar} except that they don't allocate
32 the memory needed for an object. Instead of the 'type' parameter,
33 they accept the pointer of a new object (allocated by an arbitrary
34 allocator) and initialize its object header fields.
36 Note that objects created with PyObject_{New, NewVar} are allocated
37 within the Python heap by an object allocator, the latter being
38 implemented (by default) on top of the Python raw memory
39 allocator. This ensures that Python keeps control on the user's
40 objects regarding their memory management; for instance, they may be
41 subject to automatic garbage collection.
43 In case a specific form of memory management is needed, implying that
44 the objects would not reside in the Python heap (for example standard
45 malloc heap(s) are mandatory, use of shared memory, C++ local storage
46 or operator new), you must first allocate the object with your custom
47 allocator, then pass its pointer to PyObject_{Init, InitVar} for
48 filling in its Python-specific fields: reference count, type pointer,
49 possibly others. You should be aware that Python has very limited
50 control over these objects because they don't cooperate with the
51 Python memory manager. Such objects may not be eligible for automatic
52 garbage collection and you have to make sure that they are released
53 accordingly whenever their destructor gets called (cf. the specific
54 form of memory management you're using).
56 Unless you have specific memory management requirements, it is
57 recommended to use PyObject_{New, NewVar, Del}. */
59 /*
60 * Core object memory allocator
61 * ============================
64 /* The purpose of the object allocator is to make the distinction
65 between "object memory" and the rest within the Python heap.
67 Object memory is the one allocated by PyObject_{New, NewVar}, i.e.
68 the one that holds the object's representation defined by its C
69 type structure, *excluding* any object-specific memory buffers that
70 might be referenced by the structure (for type structures that have
71 pointer fields). By default, the object memory allocator is
72 implemented on top of the raw memory allocator.
74 The PyCore_* macros can be defined to make the interpreter use a
75 custom object memory allocator. They are reserved for internal
76 memory management purposes exclusively. Both the core and extension
77 modules should use the PyObject_* API. */
79 #ifdef WITH_PYMALLOC
80 #define PyCore_OBJECT_MALLOC_FUNC _PyCore_ObjectMalloc
81 #define PyCore_OBJECT_REALLOC_FUNC _PyCore_ObjectRealloc
82 #define PyCore_OBJECT_FREE_FUNC _PyCore_ObjectFree
83 #define NEED_TO_DECLARE_OBJECT_MALLOC_AND_FRIEND
84 #endif /* !WITH_PYMALLOC */
86 #ifndef PyCore_OBJECT_MALLOC_FUNC
87 #undef PyCore_OBJECT_REALLOC_FUNC
88 #undef PyCore_OBJECT_FREE_FUNC
89 #define PyCore_OBJECT_MALLOC_FUNC PyCore_MALLOC_FUNC
90 #define PyCore_OBJECT_REALLOC_FUNC PyCore_REALLOC_FUNC
91 #define PyCore_OBJECT_FREE_FUNC PyCore_FREE_FUNC
92 #endif
94 #ifndef PyCore_OBJECT_MALLOC_PROTO
95 #undef PyCore_OBJECT_REALLOC_PROTO
96 #undef PyCore_OBJECT_FREE_PROTO
97 #define PyCore_OBJECT_MALLOC_PROTO PyCore_MALLOC_PROTO
98 #define PyCore_OBJECT_REALLOC_PROTO PyCore_REALLOC_PROTO
99 #define PyCore_OBJECT_FREE_PROTO PyCore_FREE_PROTO
100 #endif
102 #ifdef NEED_TO_DECLARE_OBJECT_MALLOC_AND_FRIEND
103 extern void *PyCore_OBJECT_MALLOC_FUNC PyCore_OBJECT_MALLOC_PROTO;
104 extern void *PyCore_OBJECT_REALLOC_FUNC PyCore_OBJECT_REALLOC_PROTO;
105 extern void PyCore_OBJECT_FREE_FUNC PyCore_OBJECT_FREE_PROTO;
106 #endif
108 #ifndef PyCore_OBJECT_MALLOC
109 #undef PyCore_OBJECT_REALLOC
110 #undef PyCore_OBJECT_FREE
111 #define PyCore_OBJECT_MALLOC(n) PyCore_OBJECT_MALLOC_FUNC(n)
112 #define PyCore_OBJECT_REALLOC(p, n) PyCore_OBJECT_REALLOC_FUNC((p), (n))
113 #define PyCore_OBJECT_FREE(p) PyCore_OBJECT_FREE_FUNC(p)
114 #endif
117 * Raw object memory interface
118 * ===========================
121 /* The use of this API should be avoided, unless a builtin object
122 constructor inlines PyObject_{New, NewVar}, either because the
123 latter functions cannot allocate the exact amount of needed memory,
124 either for speed. This situation is exceptional, but occurs for
125 some object constructors (PyBuffer_New, PyList_New...). Inlining
126 PyObject_{New, NewVar} for objects that are supposed to belong to
127 the Python heap is discouraged. If you really have to, make sure
128 the object is initialized with PyObject_{Init, InitVar}. Do *not*
129 inline PyObject_{Init, InitVar} for user-extension types or you
130 might seriously interfere with Python's memory management. */
132 /* Functions */
134 /* Wrappers around PyCore_OBJECT_MALLOC and friends; useful if you
135 need to be sure that you are using the same object memory allocator
136 as Python. These wrappers *do not* make sure that allocating 0
137 bytes returns a non-NULL pointer. Returned pointers must be checked
138 for NULL explicitly; no action is performed on failure. */
139 extern DL_IMPORT(void *) PyObject_Malloc(size_t);
140 extern DL_IMPORT(void *) PyObject_Realloc(void *, size_t);
141 extern DL_IMPORT(void) PyObject_Free(void *);
143 /* Macros */
144 #define PyObject_MALLOC(n) PyCore_OBJECT_MALLOC(n)
145 #define PyObject_REALLOC(op, n) PyCore_OBJECT_REALLOC((void *)(op), (n))
146 #define PyObject_FREE(op) PyCore_OBJECT_FREE((void *)(op))
149 * Generic object allocator interface
150 * ==================================
153 /* Functions */
154 extern DL_IMPORT(PyObject *) PyObject_Init(PyObject *, PyTypeObject *);
155 extern DL_IMPORT(PyVarObject *) PyObject_InitVar(PyVarObject *,
156 PyTypeObject *, int);
157 extern DL_IMPORT(PyObject *) _PyObject_New(PyTypeObject *);
158 extern DL_IMPORT(PyVarObject *) _PyObject_NewVar(PyTypeObject *, int);
159 extern DL_IMPORT(void) _PyObject_Del(PyObject *);
161 #define PyObject_New(type, typeobj) \
162 ( (type *) _PyObject_New(typeobj) )
163 #define PyObject_NewVar(type, typeobj, n) \
164 ( (type *) _PyObject_NewVar((typeobj), (n)) )
165 #define PyObject_Del(op) _PyObject_Del((PyObject *)(op))
167 /* Macros trading binary compatibility for speed. See also pymem.h.
168 Note that these macros expect non-NULL object pointers.*/
169 #define PyObject_INIT(op, typeobj) \
170 ((op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), \
171 (PyType_SUPPORTS_WEAKREFS((typeobj)) \
172 ? *(PyObject_GET_WEAKREFS_LISTPTR(op)) = NULL \
173 : NULL), \
174 (op))
175 #define PyObject_INIT_VAR(op, typeobj, size) \
176 ( (op)->ob_size = (size), PyObject_INIT((op), (typeobj)) )
178 #define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize )
179 #define _PyObject_VAR_SIZE(typeobj, n) \
180 ( (typeobj)->tp_basicsize + (n) * (typeobj)->tp_itemsize )
182 #define PyObject_NEW(type, typeobj) \
183 ( (type *) PyObject_Init( \
184 (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) )
185 #define PyObject_NEW_VAR(type, typeobj, n) \
186 ( (type *) PyObject_InitVar( \
187 (PyVarObject *) PyObject_MALLOC( _PyObject_VAR_SIZE((typeobj),(n)) ),\
188 (typeobj), (n)) )
190 #define PyObject_DEL(op) PyObject_FREE(op)
192 /* This example code implements an object constructor with a custom
193 allocator, where PyObject_New is inlined, and shows the important
194 distinction between two steps (at least):
195 1) the actual allocation of the object storage;
196 2) the initialization of the Python specific fields
197 in this storage with PyObject_{Init, InitVar}.
199 PyObject *
200 YourObject_New(...)
202 PyObject *op;
204 op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct));
205 if (op == NULL)
206 return PyErr_NoMemory();
208 op = PyObject_Init(op, &YourTypeStruct);
209 if (op == NULL)
210 return NULL;
212 op->ob_field = value;
214 return op;
217 Note that in C++, the use of the new operator usually implies that
218 the 1st step is performed automatically for you, so in a C++ class
219 constructor you would start directly with PyObject_Init/InitVar. */
222 * Garbage Collection Support
223 * ==========================
226 /* To make a new object participate in garbage collection use
227 PyObject_{New, VarNew, Del} to manage the memory. Set the type flag
228 Py_TPFLAGS_GC and define the type method tp_traverse. You should also
229 add the method tp_clear if your object is mutable. Include
230 PyGC_HEAD_SIZE in the calculation of tp_basicsize. Call
231 PyObject_GC_Init after the pointers followed by tp_traverse become
232 valid (usually just before returning the object from the allocation
233 method. Call PyObject_GC_Fini before those pointers become invalid
234 (usually at the top of the deallocation method). */
236 #ifndef WITH_CYCLE_GC
238 #define PyGC_HEAD_SIZE 0
239 #define PyObject_GC_Init(op)
240 #define PyObject_GC_Fini(op)
241 #define PyObject_AS_GC(op) (op)
242 #define PyObject_FROM_GC(op) (op)
244 #else
246 /* Add the object into the container set */
247 extern DL_IMPORT(void) _PyGC_Insert(PyObject *);
249 /* Remove the object from the container set */
250 extern DL_IMPORT(void) _PyGC_Remove(PyObject *);
252 #define PyObject_GC_Init(op) _PyGC_Insert((PyObject *)op)
253 #define PyObject_GC_Fini(op) _PyGC_Remove((PyObject *)op)
255 /* Structure *prefixed* to container objects participating in GC */
256 typedef struct _gc_head {
257 struct _gc_head *gc_next;
258 struct _gc_head *gc_prev;
259 int gc_refs;
260 } PyGC_Head;
262 #define PyGC_HEAD_SIZE sizeof(PyGC_Head)
264 /* Test if a type has a GC head */
265 #define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_GC)
267 /* Test if an object has a GC head */
268 #define PyObject_IS_GC(o) PyType_IS_GC((o)->ob_type)
270 /* Get an object's GC head */
271 #define PyObject_AS_GC(o) ((PyGC_Head *)(o)-1)
273 /* Get the object given the PyGC_Head */
274 #define PyObject_FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
276 extern DL_IMPORT(void) _PyGC_Dump(PyGC_Head *);
278 #endif /* WITH_CYCLE_GC */
280 /* Test if a type supports weak references */
281 #define PyType_SUPPORTS_WEAKREFS(t) \
282 (PyType_HasFeature((t), Py_TPFLAGS_HAVE_WEAKREFS) \
283 && ((t)->tp_weaklistoffset > 0))
285 #define PyObject_GET_WEAKREFS_LISTPTR(o) \
286 ((PyObject **) (((char *) (o)) + (o)->ob_type->tp_weaklistoffset))
288 #ifdef __cplusplus
290 #endif
291 #endif /* !Py_OBJIMPL_H */