Skip to content

Commit 7b9d7f7

Browse files
committed
Fix exception attribute refcounts
1 parent a2aba9e commit 7b9d7f7

File tree

2 files changed

+14
-12
lines changed
  • graalpython
    • com.oracle.graal.python.cext/src
    • com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception

2 files changed

+14
-12
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ PyAPI_FUNC(PyObject*) get_##NAME(RECEIVER obj) { \
426426
}
427427
#define OBJECT_FIELD_SETTER(RECEIVER, NAME) \
428428
PyAPI_FUNC(void) set_##NAME(RECEIVER obj, PyObject* value) { \
429+
Py_XINCREF(value); \
429430
Py_XSETREF(obj->NAME, value); \
430431
}
431432
#define PRIMITIVE_FIELD_GETTER(RECEIVER, RESULT, NAME) \

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ExceptionNodes.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.oracle.graal.python.nodes.ErrorMessages;
1818
import com.oracle.graal.python.nodes.PGuards;
1919
import com.oracle.graal.python.nodes.PRaiseNode;
20+
import com.oracle.graal.python.runtime.PythonContext;
2021
import com.oracle.graal.python.runtime.formatting.ErrorMessageFormatter;
2122
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
2223
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -40,8 +41,8 @@ private static Object noValueToNone(Object obj) {
4041
return obj != PNone.NO_VALUE ? obj : PNone.NONE;
4142
}
4243

43-
private static Object noneToNoValue(Object obj) {
44-
return obj != PNone.NONE ? obj : PNone.NO_VALUE;
44+
private static Object noneToNativeNull(Node node, Object obj) {
45+
return obj != PNone.NONE ? obj : PythonContext.get(node).getNativeNull();
4546
}
4647

4748
@GenerateUncached
@@ -97,12 +98,12 @@ static void doManaged(PBaseException exception, Object value) {
9798
}
9899

99100
@Specialization(guards = "check.execute(inliningTarget, exception)")
100-
static void doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAbstractNativeObject exception, Object value,
101+
static void doNative(Node inliningTarget, PythonAbstractNativeObject exception, Object value,
101102
@SuppressWarnings("unused") @Cached PyExceptionInstanceCheckNode check,
102103
@Cached CApiTransitions.PythonToNativeNode excToNative,
103104
@Cached CApiTransitions.PythonToNativeNode valueToNative,
104105
@Cached CExtNodes.PCallCapiFunction callSetter) {
105-
callSetter.call(NativeMember.CAUSE.getSetterFunctionName(), excToNative.execute(exception), valueToNative.execute(noneToNoValue(value)));
106+
callSetter.call(NativeMember.CAUSE.getSetterFunctionName(), excToNative.execute(exception), valueToNative.execute(noneToNativeNull(inliningTarget, value)));
106107
}
107108

108109
@Specialization
@@ -156,21 +157,21 @@ public static void executeUncached(Object e, Object value) {
156157

157158
@Specialization(guards = "isNone(value)")
158159
static void doManaged(PBaseException exception, @SuppressWarnings("unused") PNone value) {
159-
exception.setCause(null);
160+
exception.setContext(null);
160161
}
161162

162163
@Specialization(guards = "!isNone(value)")
163164
static void doManaged(PBaseException exception, Object value) {
164-
exception.setCause(value);
165+
exception.setContext(value);
165166
}
166167

167168
@Specialization(guards = "check.execute(inliningTarget, exception)")
168-
static void doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAbstractNativeObject exception, Object value,
169+
static void doNative(Node inliningTarget, PythonAbstractNativeObject exception, Object value,
169170
@SuppressWarnings("unused") @Cached PyExceptionInstanceCheckNode check,
170171
@Cached CApiTransitions.PythonToNativeNode excToNative,
171172
@Cached CApiTransitions.PythonToNativeNode valueToNative,
172173
@Cached CExtNodes.PCallCapiFunction callSetter) {
173-
callSetter.call(NativeMember.CONTEXT.getSetterFunctionName(), excToNative.execute(exception), valueToNative.execute(noneToNoValue(value)));
174+
callSetter.call(NativeMember.CONTEXT.getSetterFunctionName(), excToNative.execute(exception), valueToNative.execute(noneToNativeNull(inliningTarget, value)));
174175
}
175176

176177
@Specialization
@@ -196,11 +197,11 @@ static boolean doManaged(PBaseException exception) {
196197
}
197198

198199
@Specialization(guards = "check.execute(inliningTarget, exception)")
199-
static boolean doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAbstractNativeObject exception,
200+
static boolean doNative(Node inliningTarget, PythonAbstractNativeObject exception,
200201
@SuppressWarnings("unused") @Cached PyExceptionInstanceCheckNode check,
201202
@Cached CApiTransitions.PythonToNativeNode toNative,
202203
@Cached CExtNodes.PCallCapiFunction callGetter) {
203-
return (byte) callGetter.call(NativeMember.SUPPRESS_CONTEXT.getGetterFunctionName(), toNative.execute(noneToNoValue(exception))) != 0;
204+
return (byte) callGetter.call(NativeMember.SUPPRESS_CONTEXT.getGetterFunctionName(), toNative.execute(noneToNativeNull(inliningTarget, exception))) != 0;
204205
}
205206

206207
@Specialization
@@ -301,12 +302,12 @@ static void doManaged(PBaseException exception, PTraceback value) {
301302
}
302303

303304
@Specialization(guards = "check.execute(inliningTarget, exception)")
304-
static void doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAbstractNativeObject exception, Object value,
305+
static void doNative(Node inliningTarget, PythonAbstractNativeObject exception, Object value,
305306
@SuppressWarnings("unused") @Cached PyExceptionInstanceCheckNode check,
306307
@Cached CApiTransitions.PythonToNativeNode excToNative,
307308
@Cached CApiTransitions.PythonToNativeNode valueToNative,
308309
@Cached CExtNodes.PCallCapiFunction callSetter) {
309-
callSetter.call(NativeMember.TRACEBACK.getSetterFunctionName(), excToNative.execute(exception), valueToNative.execute(noneToNoValue(value)));
310+
callSetter.call(NativeMember.TRACEBACK.getSetterFunctionName(), excToNative.execute(exception), valueToNative.execute(noneToNativeNull(inliningTarget, value)));
310311
}
311312

312313
@Specialization

0 commit comments

Comments
 (0)