Skip to content

Commit 0989a36

Browse files
committed
[GR-23234] Implement gi_frame
PullRequest: graalpython/1046
2 parents 7363be3 + f551a26 commit 0989a36

File tree

1 file changed

+26
-0
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator

1 file changed

+26
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/GeneratorBuiltins.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.oracle.graal.python.builtins.objects.PNone;
4545
import com.oracle.graal.python.builtins.objects.code.PCode;
4646
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
47+
import com.oracle.graal.python.builtins.objects.dict.PDict;
4748
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
4849
import com.oracle.graal.python.builtins.objects.frame.PFrame;
4950
import com.oracle.graal.python.builtins.objects.function.PArguments;
@@ -66,6 +67,7 @@
6667
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6768
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
6869
import com.oracle.graal.python.runtime.exception.PException;
70+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
6971
import com.oracle.graal.python.util.PythonUtils;
7072
import com.oracle.truffle.api.CallTarget;
7173
import com.oracle.truffle.api.CompilerDirectives;
@@ -468,6 +470,30 @@ static Object getRunning(PGenerator self) {
468470
}
469471
}
470472

473+
@Builtin(name = "gi_frame", minNumOfPositionalArgs = 1, isGetter = true)
474+
@GenerateNodeFactory
475+
public abstract static class GetFrameNode extends PythonUnaryBuiltinNode {
476+
@Specialization
477+
static Object getFrame(PGenerator self,
478+
@Cached PythonObjectFactory factory) {
479+
if (self.isFinished()) {
480+
return PNone.NONE;
481+
} else {
482+
MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
483+
PDict locals = PArguments.getGeneratorFrameLocals(generatorFrame);
484+
Object[] arguments = PArguments.create();
485+
// TODO msimacek - this way, the generator will always have lineno == 1
486+
Node location = self.getCurrentCallTarget().getRootNode();
487+
PFrame frame = factory.createPFrame(PFrame.Reference.EMPTY, location, locals, false);
488+
PArguments.setGlobals(arguments, PArguments.getGlobals(self.getArguments()));
489+
PArguments.setClosure(arguments, PArguments.getClosure(self.getArguments()));
490+
PArguments.setGeneratorFrame(arguments, generatorFrame);
491+
frame.setArguments(arguments);
492+
return frame;
493+
}
494+
}
495+
}
496+
471497
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1)
472498
@GenerateNodeFactory
473499
abstract static class ReprNode extends PythonUnaryBuiltinNode {

0 commit comments

Comments
 (0)