|
43 | 43 | import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE; |
44 | 44 | import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PTR_ADD; |
45 | 45 | 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; |
46 | 47 | import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_GC_DEL; |
47 | 48 | import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_MEMORYVIEW_FROM_OBJECT; |
48 | 49 | 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; |
49 | 51 | import static com.oracle.graal.python.builtins.objects.cext.structs.CConstants.PYLONG_BITS_IN_DIGIT; |
50 | 52 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyFloatObject__ob_fval; |
51 | 53 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMethodDef__ml_doc; |
|
58 | 60 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyModuleDef__m_methods; |
59 | 61 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyModuleDef__m_size; |
60 | 62 | 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; |
61 | 64 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyObject__ob_type; |
62 | 65 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_as_buffer; |
63 | 66 | import static com.oracle.graal.python.nodes.HiddenAttr.METHOD_DEF_PTR; |
@@ -1105,15 +1108,24 @@ static void doDecref(Node inliningTarget, Object pointer, |
1105 | 1108 | @Cached(inline = false) CApiTransitions.ToPythonWrapperNode toPythonWrapperNode, |
1106 | 1109 | @Cached InlinedBranchProfile isWrapperProfile, |
1107 | 1110 | @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) { |
1109 | 1114 | PythonNativeWrapper wrapper = toPythonWrapperNode.executeWrapper(pointer, false); |
1110 | 1115 | if (wrapper instanceof PythonAbstractObjectNativeWrapper objectWrapper) { |
1111 | 1116 | isWrapperProfile.enter(inliningTarget); |
1112 | 1117 | objectWrapper.decRef(); |
1113 | 1118 | } else if (wrapper == null) { |
1114 | 1119 | isNativeObject.enter(inliningTarget); |
1115 | 1120 | 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 | + } |
1117 | 1129 | } else { |
1118 | 1130 | throw CompilerDirectives.shouldNotReachHere("Cannot DECREF non-object"); |
1119 | 1131 | } |
|
0 commit comments