1
1
#include "Python.h"
2
- #include "pycore_object.h" // _PyObject_GET_WEAKREFS_LISTPTR()
2
+ #include "pycore_object.h" // _PyType_SUPPORTS_WEAKREFS
3
3
#include "structmember.h" // PyMemberDef
4
4
5
5
6
- #define GET_WEAKREFS_LISTPTR (o ) \
7
- ((PyWeakReference **) _PyObject_GET_WEAKREFS_LISTPTR(o))
6
+ static inline PyWeakReference * * get_weakrefs_listptr (PyObject * op );
8
7
9
8
10
9
/***** weakref objects *****/
@@ -59,7 +58,7 @@ clear_weakref(PyWeakReference *self)
59
58
PyObject * callback = self -> wr_callback ;
60
59
61
60
if (self -> wr_object != Py_None ) {
62
- PyWeakReference * * list = GET_WEAKREFS_LISTPTR (self -> wr_object );
61
+ PyWeakReference * * list = get_weakrefs_listptr (self -> wr_object );
63
62
64
63
if (* list == self )
65
64
/* If 'self' is the end of the list (and thus self->wr_next == NULL)
@@ -308,7 +307,7 @@ weakref___new__(PyTypeObject *type, PyObject *args, PyObject *kwargs)
308
307
}
309
308
if (callback == Py_None )
310
309
callback = NULL ;
311
- list = GET_WEAKREFS_LISTPTR (ob );
310
+ list = get_weakrefs_listptr (ob );
312
311
get_basic_refs (* list , & ref , & proxy );
313
312
if (callback == NULL && type == & _PyWeakref_RefType ) {
314
313
if (ref != NULL ) {
@@ -801,7 +800,7 @@ PyWeakref_NewRef(PyObject *ob, PyObject *callback)
801
800
Py_TYPE (ob )-> tp_name );
802
801
return NULL ;
803
802
}
804
- list = GET_WEAKREFS_LISTPTR (ob );
803
+ list = get_weakrefs_listptr (ob );
805
804
get_basic_refs (* list , & ref , & proxy );
806
805
if (callback == Py_None )
807
806
callback = NULL ;
@@ -860,7 +859,7 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
860
859
Py_TYPE (ob )-> tp_name );
861
860
return NULL ;
862
861
}
863
- list = GET_WEAKREFS_LISTPTR (ob );
862
+ list = get_weakrefs_listptr (ob );
864
863
get_basic_refs (* list , & ref , & proxy );
865
864
if (callback == Py_None )
866
865
callback = NULL ;
@@ -941,16 +940,30 @@ handle_callback(PyWeakReference *ref, PyObject *callback)
941
940
942
941
/***** object weakrefs *****/
943
942
943
+ /* Return the *address* of the object's weaklist. */
944
+ static inline PyWeakReference * *
945
+ get_weakrefs_listptr (PyObject * op )
946
+ {
947
+ if (PyType_Check (op ) &&
948
+ ((PyTypeObject * )op )-> tp_flags & _Py_TPFLAGS_STATIC_BUILTIN ) {
949
+ static_builtin_state * state = _PyStaticType_GetState (
950
+ (PyTypeObject * )op );
951
+ return _PyStaticType_GET_WEAKREFS_LISTPTR (state );
952
+ }
953
+ Py_ssize_t offset = Py_TYPE (op )-> tp_weaklistoffset ;
954
+ return (PyWeakReference * * )((char * )op + offset );
955
+ }
956
+
944
957
PyObject * *
945
958
PyObject_GET_WEAKREFS_LISTPTR (PyObject * op )
946
959
{
947
- return _PyObject_GET_WEAKREFS_LISTPTR (op );
960
+ return ( PyObject * * ) get_weakrefs_listptr (op );
948
961
}
949
962
950
963
PyWeakReference *
951
964
_PyObject_GetWeakRefsHead (PyObject * op )
952
965
{
953
- return (PyWeakReference * )(* _PyObject_GET_WEAKREFS_LISTPTR (op ));
966
+ return (PyWeakReference * )(* get_weakrefs_listptr (op ));
954
967
}
955
968
956
969
Py_ssize_t
@@ -959,7 +972,7 @@ _PyObject_GetWeakRefCount(PyObject *op)
959
972
if (!_PyType_SUPPORTS_WEAKREFS (Py_TYPE (op ))) {
960
973
return 0 ;
961
974
}
962
- PyWeakReference * * wrlist = GET_WEAKREFS_LISTPTR (op );
975
+ PyWeakReference * * wrlist = get_weakrefs_listptr (op );
963
976
return _PyWeakref_GetWeakrefCount (* wrlist );
964
977
}
965
978
@@ -995,7 +1008,7 @@ PyObject_ClearWeakRefs(PyObject *object)
995
1008
PyErr_BadInternalCall ();
996
1009
return ;
997
1010
}
998
- list = GET_WEAKREFS_LISTPTR (object );
1011
+ list = get_weakrefs_listptr (object );
999
1012
/* Remove the callback-less basic and proxy references */
1000
1013
if (* list != NULL && (* list )-> wr_callback == NULL ) {
1001
1014
clear_weakref (* list );
@@ -1071,11 +1084,11 @@ void
1071
1084
_PyStaticType_ClearWeakRefs (PyTypeObject * type )
1072
1085
{
1073
1086
static_builtin_state * state = _PyStaticType_GetState (type );
1074
- PyObject * * list = _PyStaticType_GET_WEAKREFS_LISTPTR (state );
1087
+ PyWeakReference * * list = _PyStaticType_GET_WEAKREFS_LISTPTR (state );
1075
1088
while (* list != NULL ) {
1076
1089
/* Note that clear_weakref() pops the first ref off the type's
1077
1090
weaklist before clearing its wr_object and wr_callback.
1078
1091
That is how we're able to loop over the list. */
1079
- clear_weakref (( PyWeakReference * ) * list );
1092
+ clear_weakref (* list );
1080
1093
}
1081
1094
}
0 commit comments