FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpython/Include/cpython/objimpl.h at 3.8 · 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
113 lines (83 loc) · 3.52 KB
Breadcrumbs
cpython
/
Include
/
cpython
/
objimpl.h
Copy path
File metadata and controls
113 lines (83 loc) · 3.52 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
#ifndef
Py_CPYTHON_OBJIMPL_H
# error
"this header file must not be included directly"
#endif
#ifdef
__cplusplus
extern
"C"
{
#endif
/* 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 has a GC head */
#define
PyObject_IS_GC
(
o
) \
(PyType_IS_GC(Py_TYPE(o)) \
&& (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o)))
/* GC information is stored BEFORE the object structure. */
typedef
struct
{
// Pointer to next object in the list.
// 0 means the object is not tracked
uintptr_t
_gc_next
;
// Pointer to previous object in the list.
// Lowest two bits are used for flags documented later.
uintptr_t
_gc_prev
;
}
PyGC_Head
;
#define
_Py_AS_GC
(
o
) ((PyGC_Head *)(o)-1)
/* True if the object is currently tracked by the GC. */
#define
_PyObject_GC_IS_TRACKED
(
o
) (_Py_AS_GC(o)->_gc_next != 0)
/* True if the object may be tracked by the GC in the future, or already is.
This can be useful to implement some optimizations. */
#define
_PyObject_GC_MAY_BE_TRACKED
(
obj
) \
(PyObject_IS_GC(obj) && \
(!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj)))
/* Bit flags for _gc_prev */
/* Bit 0 is set when tp_finalize is called */
#define
_PyGC_PREV_MASK_FINALIZED
(1)
/* Bit 1 is set when the object is in generation which is GCed currently. */
#define
_PyGC_PREV_MASK_COLLECTING
(2)
/* The (N-2) most significant bits contain the real address. */
#define
_PyGC_PREV_SHIFT
(2)
#define
_PyGC_PREV_MASK
(((uintptr_t) -1) << _PyGC_PREV_SHIFT)
// Lowest bit of _gc_next is used for flags only in GC.
// But it is always 0 for normal code.
#define
_PyGCHead_NEXT
(
g
) ((PyGC_Head*)(g)->_gc_next)
#define
_PyGCHead_SET_NEXT
(
g
,
p
) ((g)->_gc_next = (uintptr_t)(p))
// Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags.
#define
_PyGCHead_PREV
(
g
) ((PyGC_Head*)((g)->_gc_prev & _PyGC_PREV_MASK))
#define
_PyGCHead_SET_PREV
(
g
,
p
) do { \
assert(((uintptr_t)p & ~_PyGC_PREV_MASK) == 0); \
(g)->_gc_prev = ((g)->_gc_prev & ~_PyGC_PREV_MASK) \
| ((uintptr_t)(p)); \
} while (0)
#define
_PyGCHead_FINALIZED
(
g
) \
(((g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0)
#define
_PyGCHead_SET_FINALIZED
(
g
) \
((g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED)
#define
_PyGC_FINALIZED
(
o
) \
_PyGCHead_FINALIZED(_Py_AS_GC(o))
#define
_PyGC_SET_FINALIZED
(
o
) \
_PyGCHead_SET_FINALIZED(_Py_AS_GC(o))
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)
#define
PyObject_GET_WEAKREFS_LISTPTR
(
o
) \
((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset))
#ifdef
__cplusplus
}
#endif
Back
|
FazBrowse Home
|
New Git URL