Skip to content

Commit 568f7ca

Browse files
committed
Make exceptions picklable
1 parent 0a42832 commit 568f7ca

File tree

1 file changed

+61
-2
lines changed

1 file changed

+61
-2
lines changed

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

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
2929
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CAUSE__;
3030
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CONTEXT__;
31+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
3132
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__SUPPRESS_CONTEXT__;
3233
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__TRACEBACK__;
3334
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
35+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
3436

3537
import java.util.IllegalFormatException;
3638
import java.util.List;
@@ -40,16 +42,21 @@
4042
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4143
import com.oracle.graal.python.builtins.PythonBuiltins;
4244
import com.oracle.graal.python.builtins.objects.PNone;
45+
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
4346
import com.oracle.graal.python.builtins.objects.list.PList;
47+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4448
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
4549
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
50+
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
4651
import com.oracle.graal.python.nodes.ErrorMessages;
4752
import com.oracle.graal.python.nodes.PGuards;
4853
import com.oracle.graal.python.nodes.PRaiseNode;
54+
import com.oracle.graal.python.nodes.argument.ReadArgumentNode;
4955
import com.oracle.graal.python.nodes.expression.CastToListExpressionNode.CastToListNode;
5056
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5157
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5258
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
59+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5360
import com.oracle.graal.python.nodes.object.GetLazyClassNode;
5461
import com.oracle.graal.python.nodes.util.CannotCastException;
5562
import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode;
@@ -64,6 +71,8 @@
6471
import com.oracle.truffle.api.dsl.NodeFactory;
6572
import com.oracle.truffle.api.dsl.Specialization;
6673
import com.oracle.truffle.api.frame.VirtualFrame;
74+
import com.oracle.truffle.api.interop.UnsupportedMessageException;
75+
import com.oracle.truffle.api.library.CachedLibrary;
6776
import com.oracle.truffle.api.profiles.ConditionProfile;
6877

6978
@CoreFunctions(extendClasses = PythonBuiltinClassType.PBaseException)
@@ -147,7 +156,11 @@ public Object args(VirtualFrame frame, PBaseException self, Object value,
147156
return PNone.NONE;
148157
}
149158

150-
public abstract Object executeObject(VirtualFrame frame, Object excObj);
159+
public abstract Object executeObject(VirtualFrame frame, Object excObj, Object value);
160+
161+
public static ArgsNode create() {
162+
return BaseExceptionBuiltinsFactory.ArgsNodeFactory.create(new ReadArgumentNode[]{});
163+
}
151164
}
152165

153166
@Builtin(name = __CAUSE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
@@ -226,7 +239,7 @@ public Object setSuppressContext(PBaseException self, Object value,
226239
try {
227240
self.setSuppressContext(castToJavaBooleanNode.execute(value));
228241
} catch (CannotCastException e) {
229-
raise(TypeError, ErrorMessages.ATTR_VALUE_MUST_BE_BOOL);
242+
throw raise(TypeError, ErrorMessages.ATTR_VALUE_MUST_BE_BOOL);
230243
}
231244
return PNone.NONE;
232245
}
@@ -277,4 +290,50 @@ PBaseException doSetTraceback(PBaseException self, PTraceback tb) {
277290
return self;
278291
}
279292
}
293+
294+
@Builtin(name = __DICT__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
295+
@GenerateNodeFactory
296+
abstract static class DictNode extends PythonBinaryBuiltinNode {
297+
@Specialization(limit = "1")
298+
PNone dict(PBaseException self, PHashingCollection mapping,
299+
@CachedLibrary("self") PythonObjectLibrary lib) {
300+
try {
301+
lib.setDict(self, mapping);
302+
} catch (UnsupportedMessageException e) {
303+
CompilerDirectives.transferToInterpreterAndInvalidate();
304+
throw new IllegalStateException(e);
305+
}
306+
return PNone.NONE;
307+
}
308+
309+
@Specialization(guards = "isNoValue(mapping)", limit = "1")
310+
Object dict(PBaseException self, @SuppressWarnings("unused") PNone mapping,
311+
@CachedLibrary("self") PythonObjectLibrary lib) {
312+
PHashingCollection dict = lib.getDict(self);
313+
if (dict == null) {
314+
dict = factory().createDictFixedStorage(self);
315+
try {
316+
lib.setDict(self, dict);
317+
} catch (UnsupportedMessageException e) {
318+
CompilerDirectives.transferToInterpreterAndInvalidate();
319+
throw new IllegalStateException(e);
320+
}
321+
}
322+
return dict;
323+
}
324+
}
325+
326+
@Builtin(name = __REDUCE__, minNumOfPositionalArgs = 1)
327+
@GenerateNodeFactory
328+
public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
329+
@Specialization(limit = "1")
330+
Object reduce(VirtualFrame frame, PBaseException self,
331+
@CachedLibrary("self") PythonObjectLibrary lib,
332+
@Cached ArgsNode argsNode) {
333+
LazyPythonClass clazz = lib.getLazyPythonClass(self);
334+
Object args = argsNode.executeObject(frame, self, PNone.NO_VALUE);
335+
Object dict = lib.lookupAttribute(self, __DICT__);
336+
return factory().createTuple(new Object[]{clazz, args, dict});
337+
}
338+
}
280339
}

0 commit comments

Comments
 (0)