Skip to content

Commit 3f90982

Browse files
committed
Do decref in managed in DecRefPointerNode
1 parent 3b07664 commit 3f90982

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@
4343
import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE;
4444
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PTR_ADD;
4545
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PTR_COMPARE;
46+
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_DEALLOC;
4647
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_GC_DEL;
4748
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_MEMORYVIEW_FROM_OBJECT;
4849
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TYPE_GENERIC_ALLOC;
50+
import static com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper.IMMORTAL_REFCNT;
4951
import static com.oracle.graal.python.builtins.objects.cext.structs.CConstants.PYLONG_BITS_IN_DIGIT;
5052
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyFloatObject__ob_fval;
5153
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMethodDef__ml_doc;
@@ -58,6 +60,7 @@
5860
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyModuleDef__m_methods;
5961
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyModuleDef__m_size;
6062
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyModuleDef__m_slots;
63+
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyObject__ob_refcnt;
6164
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyObject__ob_type;
6265
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_as_buffer;
6366
import static com.oracle.graal.python.nodes.HiddenAttr.METHOD_DEF_PTR;
@@ -1105,15 +1108,24 @@ static void doDecref(Node inliningTarget, Object pointer,
11051108
@Cached(inline = false) CApiTransitions.ToPythonWrapperNode toPythonWrapperNode,
11061109
@Cached InlinedBranchProfile isWrapperProfile,
11071110
@Cached InlinedBranchProfile isNativeObject,
1108-
@Cached(inline = false) PCallCapiFunction callDecrefNode) {
1111+
@Cached(inline = false) CStructAccess.ReadI64Node readRefcount,
1112+
@Cached(inline = false) CStructAccess.WriteLongNode writeRefcount,
1113+
@Cached(inline = false) PCallCapiFunction callDealloc) {
11091114
PythonNativeWrapper wrapper = toPythonWrapperNode.executeWrapper(pointer, false);
11101115
if (wrapper instanceof PythonAbstractObjectNativeWrapper objectWrapper) {
11111116
isWrapperProfile.enter(inliningTarget);
11121117
objectWrapper.decRef();
11131118
} else if (wrapper == null) {
11141119
isNativeObject.enter(inliningTarget);
11151120
assert NativeToPythonNode.executeUncached(pointer) instanceof PythonAbstractNativeObject;
1116-
callDecrefNode.call(NativeCAPISymbol.FUN_DECREF, pointer);
1121+
long refcount = readRefcount.read(pointer, PyObject__ob_refcnt);
1122+
if (refcount != IMMORTAL_REFCNT) {
1123+
refcount--;
1124+
writeRefcount.write(pointer, PyObject__ob_refcnt, refcount);
1125+
if (refcount == 0) {
1126+
callDealloc.call(FUN_PY_DEALLOC, pointer);
1127+
}
1128+
}
11171129
} else {
11181130
throw CompilerDirectives.shouldNotReachHere("Cannot DECREF non-object");
11191131
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ public enum NativeCAPISymbol implements NativeCExtSymbol {
136136
FUN_PY_UNICODE_GET_LENGTH("PyUnicode_GetLength", Py_ssize_t, PyObject),
137137
FUN_PY_TRUFFLE_FREE("PyTruffle_Free", ArgDescriptor.Void, Pointer),
138138
FUN_PYMEM_ALLOC("PyMem_Calloc", Pointer, SIZE_T, SIZE_T),
139-
FUN_DECREF("Py_DecRef", Void, Pointer),
140-
FUN_SUBREF("PyTruffle_SUBREF", Py_ssize_t, Pointer, Py_ssize_t),
139+
FUN_PY_DEALLOC("_Py_Dealloc", Void, Pointer),
141140
FUN_BULK_DEALLOC("PyTruffle_bulk_DEALLOC", Py_ssize_t, Pointer, INT64_T),
142141
FUN_SHUTDOWN_BULK_DEALLOC("PyTruffle_shutdown_bulk_DEALLOC", Py_ssize_t, Pointer, INT64_T),
143142
FUN_TRUFFLE_ADD_SUBOFFSET("truffle_add_suboffset", Pointer, Pointer, Py_ssize_t, Py_ssize_t),

0 commit comments

Comments
 (0)