FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpython/Include/internal/pycore_object.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
/
internal
/
pycore_object.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
120 lines (103 loc) · 3.94 KB
Breadcrumbs
cpython
/
Include
/
internal
/
pycore_object.h
Copy path
File metadata and controls
120 lines (103 loc) · 3.94 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
#ifndef
Py_INTERNAL_OBJECT_H
#define
Py_INTERNAL_OBJECT_H
#ifdef
__cplusplus
extern
"C"
{
#endif
#ifndef
Py_BUILD_CORE
# error
"this header requires Py_BUILD_CORE define"
#endif
#include
"pycore_gc.h"
// _PyObject_GC_IS_TRACKED()
#include
"pycore_interp.h"
// PyInterpreterState.gc
#include
"pycore_pystate.h"
// _PyThreadState_GET()
PyAPI_FUNC
(
int
)
_PyType_CheckConsistency
(
PyTypeObject
*
type
);
PyAPI_FUNC
(
int
)
_PyDict_CheckConsistency
(
PyObject
*
mp
,
int
check_content
);
/* Tell the GC to track this object.
*
* NB: While the object is tracked by the collector, it must be safe to call the
* ob_traverse method.
*
* Internal note: interp->gc.generation0->_gc_prev doesn't have any bit flags
* because it's not object header. So we don't use _PyGCHead_PREV() and
* _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations.
*
* The PyObject_GC_Track() function is the public version of this macro.
*/
static
inline
void
_PyObject_GC_TRACK_impl
(
const
char
*
filename
,
int
lineno
,
PyObject
*
op
)
{
_PyObject_ASSERT_FROM
(
op
, !
_PyObject_GC_IS_TRACKED
(
op
),
"object already tracked by the garbage collector"
,
filename
,
lineno
,
"_PyObject_GC_TRACK"
);
PyGC_Head
*
gc
=
_Py_AS_GC
(
op
);
_PyObject_ASSERT_FROM
(
op
,
(
gc
->
_gc_prev
&
_PyGC_PREV_MASK_COLLECTING
)
==
0
,
"object is in generation which is garbage collected"
,
filename
,
lineno
,
"_PyObject_GC_TRACK"
);
PyThreadState
*
tstate
=
_PyThreadState_GET
();
PyGC_Head
*
generation0
=
tstate
->
interp
->
gc
.
generation0
;
PyGC_Head
*
last
=
(
PyGC_Head
*
)(
generation0
->
_gc_prev
);
_PyGCHead_SET_NEXT
(
last
,
gc
);
_PyGCHead_SET_PREV
(
gc
,
last
);
_PyGCHead_SET_NEXT
(
gc
,
generation0
);
generation0
->
_gc_prev
=
(
uintptr_t
)
gc
;
}
#define
_PyObject_GC_TRACK
(
op
) \
_PyObject_GC_TRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op))
/* Tell the GC to stop tracking this object.
*
* Internal note: This may be called while GC. So _PyGC_PREV_MASK_COLLECTING
* must be cleared. But _PyGC_PREV_MASK_FINALIZED bit is kept.
*
* The object must be tracked by the GC.
*
* The PyObject_GC_UnTrack() function is the public version of this macro.
*/
static
inline
void
_PyObject_GC_UNTRACK_impl
(
const
char
*
filename
,
int
lineno
,
PyObject
*
op
)
{
_PyObject_ASSERT_FROM
(
op
,
_PyObject_GC_IS_TRACKED
(
op
),
"object not tracked by the garbage collector"
,
filename
,
lineno
,
"_PyObject_GC_UNTRACK"
);
PyGC_Head
*
gc
=
_Py_AS_GC
(
op
);
PyGC_Head
*
prev
=
_PyGCHead_PREV
(
gc
);
PyGC_Head
*
next
=
_PyGCHead_NEXT
(
gc
);
_PyGCHead_SET_NEXT
(
prev
,
next
);
_PyGCHead_SET_PREV
(
next
,
prev
);
gc
->
_gc_next
=
0
;
gc
->
_gc_prev
&=
_PyGC_PREV_MASK_FINALIZED
;
}
#define
_PyObject_GC_UNTRACK
(
op
) \
_PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op))
#ifdef
Py_REF_DEBUG
extern
void
_PyDebug_PrintTotalRefs
(
void
);
#endif
#ifdef
Py_TRACE_REFS
extern
void
_Py_AddToAllObjects
(
PyObject
*
op
,
int
force
);
extern
void
_Py_PrintReferences
(
FILE
*
);
extern
void
_Py_PrintReferenceAddresses
(
FILE
*
);
#endif
static
inline
PyObject
*
*
_PyObject_GET_WEAKREFS_LISTPTR
(
PyObject
*
op
)
{
Py_ssize_t
offset
=
Py_TYPE
(
op
)
->
tp_weaklistoffset
;
return
(
PyObject
*
*
)((
char
*
)
op
+
offset
);
}
// Fast inlined version of PyType_HasFeature()
static
inline
int
_PyType_HasFeature
(
PyTypeObject
*
type
,
unsigned long
feature
) {
return
((
type
->
tp_flags
&
feature
)
!=
0
);
}
// Fast inlined version of PyObject_IS_GC()
static
inline
int
_PyObject_IS_GC
(
PyObject
*
obj
)
{
return
(
PyType_IS_GC
(
Py_TYPE
(
obj
))
&&
(
Py_TYPE
(
obj
)
->
tp_is_gc
==
NULL
||
Py_TYPE
(
obj
)
->
tp_is_gc
(
obj
)));
}
// Fast inlined version of PyType_IS_GC()
#define
_PyType_IS_GC
(
t
) _PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC)
#ifdef
__cplusplus
}
#endif
#endif
/* !Py_INTERNAL_OBJECT_H */
Back
|
FazBrowse Home
|
New Git URL