Skip to content

Commit 8ced808

Browse files
committed
[GR-50455] Avoid unnecessary upcalls for PyObject_GC_Un-/Track.
PullRequest: graalpython/3086
2 parents cf0b692 + 596e10f commit 8ced808

File tree

7 files changed

+220
-211
lines changed

7 files changed

+220
-211
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2216,14 +2216,6 @@ PyAPI_FUNC(int) PyObject_GC_IsFinalized(PyObject* a) {
22162216
PyAPI_FUNC(int) PyObject_GC_IsTracked(PyObject* a) {
22172217
FUNC_NOT_IMPLEMENTED
22182218
}
2219-
#undef PyObject_GC_Track
2220-
PyAPI_FUNC(void) PyObject_GC_Track(void* a) {
2221-
GraalPyObject_GC_Track(a);
2222-
}
2223-
#undef PyObject_GC_UnTrack
2224-
PyAPI_FUNC(void) PyObject_GC_UnTrack(void* a) {
2225-
GraalPyObject_GC_UnTrack(a);
2226-
}
22272219
#undef PyObject_GET_WEAKREFS_LISTPTR
22282220
PyAPI_FUNC(PyObject**) PyObject_GET_WEAKREFS_LISTPTR(PyObject* a) {
22292221
FUNC_NOT_IMPLEMENTED

graalpython/com.oracle.graal.python.cext/src/capi.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,6 @@ typedef struct {
239239
BUILTIN(PyObject_DelItem, int, PyObject*, PyObject*) \
240240
BUILTIN(PyObject_Dir, PyObject*, PyObject*) \
241241
BUILTIN(PyObject_Format, PyObject*, PyObject*, PyObject*) \
242-
BUILTIN(PyObject_GC_Track, void, void*) \
243-
BUILTIN(PyObject_GC_UnTrack, void, void*) \
244242
BUILTIN(PyObject_GetDoc, const char*, PyObject*) \
245243
BUILTIN(PyObject_GetItem, PyObject*, PyObject*, PyObject*) \
246244
BUILTIN(PyObject_GetIter, PyObject*, PyObject*) \
@@ -335,6 +333,8 @@ typedef struct {
335333
BUILTIN(PyTruffleNumber_UnaryOp, PyObject*, PyObject*, int) \
336334
BUILTIN(PyTruffleObject_CallFunctionObjArgs, PyObject*, PyObject*, va_list*) \
337335
BUILTIN(PyTruffleObject_CallMethodObjArgs, PyObject*, PyObject*, PyObject*, va_list*) \
336+
BUILTIN(PyTruffleObject_GC_Track, void, void*) \
337+
BUILTIN(PyTruffleObject_GC_UnTrack, void, void*) \
338338
BUILTIN(PyTruffleObject_GenericGetAttr, PyObject*, PyObject*, PyObject*) \
339339
BUILTIN(PyTruffleObject_GenericSetAttr, int, PyObject*, PyObject*, PyObject*) \
340340
BUILTIN(PyTruffleObject_GetItemString, PyObject*, PyObject*, const char*) \

graalpython/com.oracle.graal.python.cext/src/object.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1075,5 +1075,17 @@ PyVarObject* _PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems) {
10751075
}
10761076

10771077
void PyObject_GC_Del(void *tp) {
1078-
PyObject_Free(tp);
1078+
PyObject_Free(tp);
1079+
}
1080+
1081+
void PyObject_GC_Track(void* a) {
1082+
if (PyTruffle_Trace_Memory()) {
1083+
GraalPyTruffleObject_GC_Track(a);
1084+
}
1085+
}
1086+
1087+
void PyObject_GC_UnTrack(void* a) {
1088+
if (PyTruffle_Trace_Memory()) {
1089+
GraalPyTruffleObject_GC_UnTrack(a);
1090+
}
10791091
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltinRegistry.java

Lines changed: 194 additions & 194 deletions
Large diffs are not rendered by default.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,9 +1476,9 @@ protected void trace(PythonContext context, Object ptr, Reference ref, TruffleSt
14761476
}
14771477
}
14781478

1479-
@CApiBuiltin(ret = Void, args = {Pointer}, call = Direct)
1480-
abstract static class PyObject_GC_UnTrack extends PyTruffleGcTracingNode {
1481-
private static final TruffleLogger LOGGER = CApiContext.getLogger(PyObject_GC_UnTrack.class);
1479+
@CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored)
1480+
abstract static class PyTruffleObject_GC_UnTrack extends PyTruffleGcTracingNode {
1481+
private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffleObject_GC_UnTrack.class);
14821482

14831483
@Override
14841484
protected void trace(PythonContext context, Object ptr, Reference ref, TruffleString className) {
@@ -1487,9 +1487,9 @@ protected void trace(PythonContext context, Object ptr, Reference ref, TruffleSt
14871487
}
14881488
}
14891489

1490-
@CApiBuiltin(ret = Void, args = {Pointer}, call = Direct)
1491-
abstract static class PyObject_GC_Track extends PyTruffleGcTracingNode {
1492-
private static final TruffleLogger LOGGER = CApiContext.getLogger(PyObject_GC_Track.class);
1490+
@CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored)
1491+
abstract static class PyTruffleObject_GC_Track extends PyTruffleGcTracingNode {
1492+
private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffleObject_GC_Track.class);
14931493

14941494
@Override
14951495
protected void trace(PythonContext context, Object ptr, Reference ref, TruffleString className) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,8 @@ public final class CApiFunction {
537537
@CApiBuiltin(name = "PyModule_GetState", ret = Pointer, args = {PyObject}, call = CImpl)
538538
@CApiBuiltin(name = "PyModuleDef_Init", ret = PyObject, args = {PYMODULEDEF_PTR}, call = CImpl)
539539
@CApiBuiltin(name = "PyObject_SelfIter", ret = PyObject, args = {PyObject}, call = CImpl)
540+
@CApiBuiltin(name = "PyObject_GC_Track", ret = Void, args = {Pointer}, call = CImpl)
541+
@CApiBuiltin(name = "PyObject_GC_UnTrack", ret = Void, args = {Pointer}, call = CImpl)
540542
@CApiBuiltin(name = "PyMethodDescrObject_GetMethod", ret = PyMethodDef, args = {PyObject}, call = CImpl)
541543
@CApiBuiltin(name = "PyDescr_NewClassMethod", ret = PyObject, args = {PyTypeObject, PyMethodDef}, call = CImpl)
542544
@CApiBuiltin(name = "PyDescr_NewGetSet", ret = PyObject, args = {PyTypeObject, PyGetSetDef}, call = CImpl)

graalpython/lib-python/3/test/test_weakref.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,13 +1082,15 @@ def test_alive(self):
10821082
self.assertIs(r().__func__, o.some_method.__func__)
10831083
self.assertEqual(r()(), 4)
10841084

1085+
@support.impl_detail("weakref nondeterministic", graalpy=False)
10851086
def test_object_dead(self):
10861087
o = Object(1)
10871088
r = weakref.WeakMethod(o.some_method)
10881089
del o
10891090
gc.collect()
10901091
self.assertIs(r(), None)
10911092

1093+
@support.impl_detail("weakref nondeterministic", graalpy=False)
10921094
def test_method_dead(self):
10931095
C = self._subclass()
10941096
o = C(1)
@@ -1114,6 +1116,7 @@ def cb(arg):
11141116
gc.collect()
11151117
self.assertEqual(calls, [r])
11161118

1119+
@support.impl_detail("weakref nondeterministic", graalpy=False)
11171120
def test_callback_when_method_dead(self):
11181121
# Test callback behaviour when method dies first.
11191122
C = self._subclass()

0 commit comments

Comments
 (0)