FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpython/Include/cpython/objimpl.h at master · python-emscripten/cpython · GitHub
python-emscripten
cpython
Repository navigation
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpython
/
Include
/
cpython
/
objimpl.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
137 lines (101 loc) · 4.28 KB
Breadcrumbs
cpython
/
Include
/
cpython
/
objimpl.h
Copy path
File metadata and controls
137 lines (101 loc) · 4.28 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#ifndef
Py_CPYTHON_OBJIMPL_H
# error
"this header file must not be included directly"
#endif
#define
_PyObject_SIZE
(
typeobj
) ( (typeobj)->tp_basicsize )
/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a
vrbl-size object with nitems items, exclusive of gc overhead (if any). The
value is rounded up to the closest multiple of sizeof(void *), in order to
ensure that pointer fields at the end of the object are correctly aligned
for the platform (this is of special importance for subclasses of, e.g.,
str or int, so that pointers can be stored after the embedded data).
Note that there's no memory wastage in doing this, as malloc has to
return (at worst) pointer-aligned memory anyway.
*/
#if
((
SIZEOF_VOID_P
-
1
)
&
SIZEOF_VOID_P
)
!=
0
# error
"_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2"
#endif
#define
_PyObject_VAR_SIZE
(
typeobj
,
nitems
) \
_Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \
(nitems)*(typeobj)->tp_itemsize, \
SIZEOF_VOID_P)
/* This example code implements an object constructor with a custom
allocator, where PyObject_New is inlined, and shows the important
distinction between two steps (at least):
1) the actual allocation of the object storage;
2) the initialization of the Python specific fields
in this storage with PyObject_{Init, InitVar}.
PyObject *
YourObject_New(...)
{
PyObject *op;
op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct));
if (op == NULL)
return PyErr_NoMemory();
PyObject_Init(op, &YourTypeStruct);
op->ob_field = value;
...
return op;
}
Note that in C++, the use of the new operator usually implies that
the 1st step is performed automatically for you, so in a C++ class
constructor you would start directly with PyObject_Init/InitVar. */
/* Inline functions trading binary compatibility for speed:
PyObject_INIT() is the fast version of PyObject_Init(), and
PyObject_INIT_VAR() is the fast version of PyObject_InitVar().
These inline functions must not be called with op=NULL. */
static
inline
PyObject
*
_PyObject_INIT
(
PyObject
*
op
,
PyTypeObject
*
typeobj
)
{
assert
(
op
!=
NULL
);
Py_SET_TYPE
(
op
,
typeobj
);
if
(
PyType_GetFlags
(
typeobj
)
&
Py_TPFLAGS_HEAPTYPE
) {
Py_INCREF
(
typeobj
);
}
_Py_NewReference
(
op
);
return
op
;
}
#define
PyObject_INIT
(
op
,
typeobj
) \
_PyObject_INIT(_PyObject_CAST(op), (typeobj))
static
inline
PyVarObject
*
_PyObject_INIT_VAR
(
PyVarObject
*
op
,
PyTypeObject
*
typeobj
,
Py_ssize_t
size
)
{
assert
(
op
!=
NULL
);
Py_SET_SIZE
(
op
,
size
);
PyObject_INIT
((
PyObject
*
)
op
,
typeobj
);
return
op
;
}
#define
PyObject_INIT_VAR
(
op
,
typeobj
,
size
) \
_PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size))
/* This function returns the number of allocated memory blocks, regardless of size */
PyAPI_FUNC
(
Py_ssize_t
)
_Py_GetAllocatedBlocks
(
void
);
/* Macros */
#ifdef
WITH_PYMALLOC
PyAPI_FUNC
(
int
)
_PyObject_DebugMallocStats
(
FILE
*
out
);
#endif
typedef
struct
{
/* user context passed as the first argument to the 2 functions */
void
*
ctx
;
/* allocate an arena of size bytes */
void
*
(
*
alloc
) (
void
*
ctx
,
size_t
size
);
/* free an arena */
void
(
*
free
) (
void
*
ctx
,
void
*
ptr
,
size_t
size
);
}
PyObjectArenaAllocator
;
/* Get the arena allocator. */
PyAPI_FUNC
(
void
)
PyObject_GetArenaAllocator
(
PyObjectArenaAllocator
*
allocator
);
/* Set the arena allocator. */
PyAPI_FUNC
(
void
)
PyObject_SetArenaAllocator
(
PyObjectArenaAllocator
*
allocator
);
PyAPI_FUNC
(
Py_ssize_t
)
_PyGC_CollectNoFail
(
void
);
PyAPI_FUNC
(
Py_ssize_t
)
_PyGC_CollectIfEnabled
(
void
);
/* Test if an object implements the garbage collector protocol */
PyAPI_FUNC
(
int
)
PyObject_IS_GC
(
PyObject
*
obj
);
/* Code built with Py_BUILD_CORE must include pycore_gc.h instead which
defines a different _PyGC_FINALIZED() macro. */
#ifndef
Py_BUILD_CORE
// Kept for backward compatibility with Python 3.8
# define
_PyGC_FINALIZED
(
o
) PyObject_GC_IsFinalized(o)
#endif
PyAPI_FUNC
(
PyObject
*
)
_PyObject_GC_Malloc
(
size_t
size
);
PyAPI_FUNC
(
PyObject
*
)
_PyObject_GC_Calloc
(
size_t
size
);
/* Test if a type supports weak references */
#define
PyType_SUPPORTS_WEAKREFS
(
t
) ((t)->tp_weaklistoffset > 0)
PyAPI_FUNC
(
PyObject
*
*
)
PyObject_GET_WEAKREFS_LISTPTR
(
PyObject
*
op
);
Back
|
FazBrowse Home
|
New Git URL