|
28 | 28 | import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
|
29 | 29 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CAUSE__;
|
30 | 30 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CONTEXT__;
|
| 31 | +import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__; |
31 | 32 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__SUPPRESS_CONTEXT__;
|
32 | 33 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__TRACEBACK__;
|
33 | 34 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
|
| 35 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__; |
34 | 36 |
|
35 | 37 | import java.util.IllegalFormatException;
|
36 | 38 | import java.util.List;
|
|
40 | 42 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
41 | 43 | import com.oracle.graal.python.builtins.PythonBuiltins;
|
42 | 44 | import com.oracle.graal.python.builtins.objects.PNone;
|
| 45 | +import com.oracle.graal.python.builtins.objects.common.PHashingCollection; |
43 | 46 | import com.oracle.graal.python.builtins.objects.list.PList;
|
| 47 | +import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary; |
44 | 48 | import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
|
45 | 49 | import com.oracle.graal.python.builtins.objects.tuple.PTuple;
|
| 50 | +import com.oracle.graal.python.builtins.objects.type.LazyPythonClass; |
46 | 51 | import com.oracle.graal.python.nodes.ErrorMessages;
|
47 | 52 | import com.oracle.graal.python.nodes.PGuards;
|
48 | 53 | import com.oracle.graal.python.nodes.PRaiseNode;
|
| 54 | +import com.oracle.graal.python.nodes.argument.ReadArgumentNode; |
49 | 55 | import com.oracle.graal.python.nodes.expression.CastToListExpressionNode.CastToListNode;
|
50 | 56 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
51 | 57 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
|
52 | 58 | import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
|
| 59 | +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; |
53 | 60 | import com.oracle.graal.python.nodes.object.GetLazyClassNode;
|
54 | 61 | import com.oracle.graal.python.nodes.util.CannotCastException;
|
55 | 62 | import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode;
|
|
64 | 71 | import com.oracle.truffle.api.dsl.NodeFactory;
|
65 | 72 | import com.oracle.truffle.api.dsl.Specialization;
|
66 | 73 | import com.oracle.truffle.api.frame.VirtualFrame;
|
| 74 | +import com.oracle.truffle.api.interop.UnsupportedMessageException; |
| 75 | +import com.oracle.truffle.api.library.CachedLibrary; |
67 | 76 | import com.oracle.truffle.api.profiles.ConditionProfile;
|
68 | 77 |
|
69 | 78 | @CoreFunctions(extendClasses = PythonBuiltinClassType.PBaseException)
|
@@ -147,7 +156,11 @@ public Object args(VirtualFrame frame, PBaseException self, Object value,
|
147 | 156 | return PNone.NONE;
|
148 | 157 | }
|
149 | 158 |
|
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 | + } |
151 | 164 | }
|
152 | 165 |
|
153 | 166 | @Builtin(name = __CAUSE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
|
@@ -226,7 +239,7 @@ public Object setSuppressContext(PBaseException self, Object value,
|
226 | 239 | try {
|
227 | 240 | self.setSuppressContext(castToJavaBooleanNode.execute(value));
|
228 | 241 | } catch (CannotCastException e) {
|
229 |
| - raise(TypeError, ErrorMessages.ATTR_VALUE_MUST_BE_BOOL); |
| 242 | + throw raise(TypeError, ErrorMessages.ATTR_VALUE_MUST_BE_BOOL); |
230 | 243 | }
|
231 | 244 | return PNone.NONE;
|
232 | 245 | }
|
@@ -277,4 +290,50 @@ PBaseException doSetTraceback(PBaseException self, PTraceback tb) {
|
277 | 290 | return self;
|
278 | 291 | }
|
279 | 292 | }
|
| 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 | + } |
280 | 339 | }
|
0 commit comments