|
25 | 25 | */
|
26 | 26 | package com.oracle.graal.python.builtins.objects.generator;
|
27 | 27 |
|
| 28 | +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.GeneratorExit; |
28 | 29 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__ITER__;
|
29 | 30 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__NEXT__;
|
30 | 31 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
|
| 32 | +import static com.oracle.graal.python.runtime.exception.PythonErrorType.RuntimeError; |
31 | 33 | import static com.oracle.graal.python.runtime.exception.PythonErrorType.StopIteration;
|
32 | 34 | import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
|
33 | 35 | import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
|
|
45 | 47 | import com.oracle.graal.python.builtins.objects.exception.PBaseException;
|
46 | 48 | import com.oracle.graal.python.builtins.objects.frame.PFrame;
|
47 | 49 | import com.oracle.graal.python.builtins.objects.function.PArguments;
|
| 50 | +import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary; |
48 | 51 | import com.oracle.graal.python.builtins.objects.traceback.GetTracebackNode;
|
49 | 52 | import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
|
50 | 53 | import com.oracle.graal.python.builtins.objects.tuple.PTuple;
|
|
61 | 64 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
62 | 65 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
|
63 | 66 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
| 67 | +import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile; |
64 | 68 | import com.oracle.graal.python.runtime.exception.PException;
|
65 | 69 | import com.oracle.graal.python.util.PythonUtils;
|
66 | 70 | import com.oracle.truffle.api.CallTarget;
|
|
76 | 80 | import com.oracle.truffle.api.dsl.Specialization;
|
77 | 81 | import com.oracle.truffle.api.frame.MaterializedFrame;
|
78 | 82 | import com.oracle.truffle.api.frame.VirtualFrame;
|
| 83 | +import com.oracle.truffle.api.library.CachedLibrary; |
79 | 84 | import com.oracle.truffle.api.nodes.Node;
|
80 | 85 | import com.oracle.truffle.api.profiles.BranchProfile;
|
81 | 86 | import com.oracle.truffle.api.profiles.ConditionProfile;
|
@@ -402,6 +407,43 @@ private GetTracebackNode ensureGetTracebackNode() {
|
402 | 407 | }
|
403 | 408 | }
|
404 | 409 |
|
| 410 | + @Builtin(name = "close", minNumOfPositionalArgs = 1) |
| 411 | + @GenerateNodeFactory |
| 412 | + public abstract static class CloseNode extends PythonUnaryBuiltinNode { |
| 413 | + @Specialization |
| 414 | + Object close(PGenerator self, |
| 415 | + @CachedLibrary(limit = "3") PythonObjectLibrary lib, |
| 416 | + @Cached IsBuiltinClassProfile isGeneratorExit, |
| 417 | + @Cached IsBuiltinClassProfile isStopIteration, |
| 418 | + @Cached BranchProfile alreadyRunning) { |
| 419 | + if (self.isRunning()) { |
| 420 | + alreadyRunning.enter(); |
| 421 | + throw raise(ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING); |
| 422 | + } |
| 423 | + if (self.isStarted()) { |
| 424 | + PBaseException pythonException = factory().createBaseException(GeneratorExit); |
| 425 | + // Pass it to the generator where it will be thrown by the last yield, the location |
| 426 | + // will be filled there |
| 427 | + PException pException = PException.fromObject(pythonException, null); |
| 428 | + try { |
| 429 | + resumeGenerator(self, pException); |
| 430 | + } catch (PException pe) { |
| 431 | + if (isGeneratorExit.profileException(pe, GeneratorExit, lib) || isStopIteration.profileException(pe, StopIteration, lib)) { |
| 432 | + // This is the "success" path |
| 433 | + return PNone.NONE; |
| 434 | + } |
| 435 | + throw pe; |
| 436 | + } finally { |
| 437 | + self.markAsFinished(); |
| 438 | + } |
| 439 | + throw raise(RuntimeError, ErrorMessages.GENERATOR_IGNORED_EXIT); |
| 440 | + } else { |
| 441 | + self.markAsFinished(); |
| 442 | + return PNone.NONE; |
| 443 | + } |
| 444 | + } |
| 445 | + } |
| 446 | + |
405 | 447 | @Builtin(name = "gi_code", minNumOfPositionalArgs = 1, isGetter = true)
|
406 | 448 | @GenerateNodeFactory
|
407 | 449 | public abstract static class GetCodeNode extends PythonUnaryBuiltinNode {
|
|
0 commit comments