Skip to content

Commit f551a26

Browse files
committed
Implement gi_frame
1 parent d22111b commit f551a26

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
@@ -42,6 +42,7 @@
4242
import com.oracle.graal.python.builtins.objects.PNone;
4343
import com.oracle.graal.python.builtins.objects.code.PCode;
4444
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
45+
import com.oracle.graal.python.builtins.objects.dict.PDict;
4546
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
4647
import com.oracle.graal.python.builtins.objects.frame.PFrame;
4748
import com.oracle.graal.python.builtins.objects.function.PArguments;
@@ -62,6 +63,7 @@
6263
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
6364
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6465
import com.oracle.graal.python.runtime.exception.PException;
66+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
6567
import com.oracle.graal.python.util.PythonUtils;
6668
import com.oracle.truffle.api.CallTarget;
6769
import com.oracle.truffle.api.CompilerDirectives;
@@ -426,6 +428,30 @@ static Object getRunning(PGenerator self) {
426428
}
427429
}
428430

431+
@Builtin(name = "gi_frame", minNumOfPositionalArgs = 1, isGetter = true)
432+
@GenerateNodeFactory
433+
public abstract static class GetFrameNode extends PythonUnaryBuiltinNode {
434+
@Specialization
435+
static Object getFrame(PGenerator self,
436+
@Cached PythonObjectFactory factory) {
437+
if (self.isFinished()) {
438+
return PNone.NONE;
439+
} else {
440+
MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
441+
PDict locals = PArguments.getGeneratorFrameLocals(generatorFrame);
442+
Object[] arguments = PArguments.create();
443+
// TODO msimacek - this way, the generator will always have lineno == 1
444+
Node location = self.getCurrentCallTarget().getRootNode();
445+
PFrame frame = factory.createPFrame(PFrame.Reference.EMPTY, location, locals, false);
446+
PArguments.setGlobals(arguments, PArguments.getGlobals(self.getArguments()));
447+
PArguments.setClosure(arguments, PArguments.getClosure(self.getArguments()));
448+
PArguments.setGeneratorFrame(arguments, generatorFrame);
449+
frame.setArguments(arguments);
450+
return frame;
451+
}
452+
}
453+
}
454+
429455
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1)
430456
@GenerateNodeFactory
431457
abstract static class ReprNode extends PythonUnaryBuiltinNode {

0 commit comments

Comments
 (0)