Skip to content

Commit fce221b

Browse files
committed
Implement gi_yieldfrom
1 parent 609c221 commit fce221b

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@
6969
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
7070
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
7171
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
72+
import com.oracle.graal.python.nodes.generator.AbstractYieldNode;
73+
import com.oracle.graal.python.nodes.generator.YieldFromNode;
7274
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
7375
import com.oracle.graal.python.runtime.exception.PException;
7476
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -542,6 +544,21 @@ static Object getFrame(PGenerator self,
542544
}
543545
}
544546

547+
@Builtin(name = "gi_yieldfrom", minNumOfPositionalArgs = 1, isGetter = true)
548+
@GenerateNodeFactory
549+
public abstract static class GetYieldFromNode extends PythonUnaryBuiltinNode {
550+
@Specialization
551+
static Object getYieldFrom(PGenerator self) {
552+
AbstractYieldNode currentYield = self.getCurrentYieldNode();
553+
if (currentYield instanceof YieldFromNode) {
554+
int iteratorSlot = ((YieldFromNode) currentYield).getIteratorSlot();
555+
return PArguments.getControlDataFromGeneratorArguments(self.getArguments()).getIteratorAt(iteratorSlot);
556+
} else {
557+
return PNone.NONE;
558+
}
559+
}
560+
}
561+
545562
@Builtin(name = __REPR__, minNumOfPositionalArgs = 1)
546563
@GenerateNodeFactory
547564
abstract static class ReprNode extends PythonUnaryBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/generator/YieldFromNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,10 @@ public Object execute(VirtualFrame frame) {
217217
}
218218
}
219219

220+
public int getIteratorSlot() {
221+
return iteratorSlot;
222+
}
223+
220224
private GetAttributeNode getGetValue() {
221225
if (getValue == null) {
222226
CompilerDirectives.transferToInterpreterAndInvalidate();

0 commit comments

Comments
 (0)