Skip to content

Commit 2c527a0

Browse files
committed
Implement capsule destructors
1 parent 7261459 commit 2c527a0

17 files changed

+123
-37
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ PyAPI_FUNC(PyTypeObject*) getPyCapsuleTypeReference() {
1414
return &PyCapsule_Type;
1515
}
1616

17+
PyAPI_FUNC(void) PyTruffleCapsule_CallDestructor(PyObject* capsule, PyCapsule_Destructor destructor) {
18+
destructor(capsule);
19+
}
20+

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ static Object doGeneric(Object pointer, Object name, Object destructor,
9393
throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT);
9494
}
9595
Object n = interopLibrary.isNull(name) ? null : name;
96-
return factory.createCapsule(pointer, n, destructor);
96+
PyCapsule capsule = factory.createCapsule(pointer, n);
97+
if (!interopLibrary.isNull(destructor)) {
98+
capsule.registerDestructor(destructor);
99+
}
100+
return capsule;
97101
}
98102
}
99103

@@ -305,11 +309,12 @@ abstract static class PyCapsule_SetDestructor extends CApiBinaryBuiltinNode {
305309
@Specialization
306310
static int doCapsule(PyCapsule o, Object destructor,
307311
@Bind("this") Node inliningTarget,
312+
@CachedLibrary(limit = "1") InteropLibrary lib,
308313
@Cached PRaiseNode.Lazy raiseNode) {
309314
if (o.getPointer() == null) {
310315
throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetDestructor");
311316
}
312-
o.setDestructor(destructor);
317+
o.registerDestructor(lib.isNull(destructor) ? null : destructor);
313318
return 0;
314319
}
315320

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsCNModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static Object getcodec(Object encoding,
138138
throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
139139
}
140140

141-
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME, null);
141+
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME);
142142
return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode);
143143
}
144144
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsHKModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ static Object getcodec(Object encoding,
130130
throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
131131
}
132132

133-
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME, null);
133+
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME);
134134
return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode);
135135
}
136136
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsISO2022ModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ static Object getcodec(Object encoding,
140140
throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
141141
}
142142

143-
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME, null);
143+
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME);
144144
return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode);
145145
}
146146
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsJPModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ static Object getcodec(Object encoding,
162162
throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
163163
}
164164

165-
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME, null);
165+
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME);
166166
return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode);
167167
}
168168
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsKRModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ static Object getcodec(Object encoding,
135135
throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
136136
}
137137

138-
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME, null);
138+
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME);
139139
return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode);
140140
}
141141

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsTWModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ static Object getcodec(Object encoding,
130130
throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED);
131131
}
132132

133-
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME, null);
133+
PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME);
134134
return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode);
135135
}
136136
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibytecodecModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ protected static void registerCodec(String name, int cidx, CodecType ct, int mid
113113
if (midx != -1) {
114114
DBCSMap h = maps[midx] = new DBCSMap(name, tsName, charset, mt);
115115
codec.setAttribute(toTruffleStringUncached(h.charsetMapName),
116-
factory.createCapsule(h, PyMultibyteCodec_CAPSULE_NAME, null));
116+
factory.createCapsule(h, PyMultibyteCodec_CAPSULE_NAME));
117117
}
118118
}
119119
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CFieldBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ static Object error(VirtualFrame frame, FieldSet setfunc, Pointer ptr, Object va
753753
private static TruffleString CTYPES_CFIELD_CAPSULE_NAME_PYMEM = tsLiteral("_ctypes/cfield.c pymem");
754754

755755
private static PyCapsule createPyMemCapsule(Pointer pointer, PythonObjectFactory factory) {
756-
PyCapsule capsule = factory.createCapsule(pointer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, null);
756+
PyCapsule capsule = factory.createCapsule(pointer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM);
757757
new PointerReference(capsule, pointer, PythonContext.get(factory).getSharedFinalizer());
758758
return capsule;
759759
}

0 commit comments

Comments
 (0)