Skip to content

Commit e2ed64d

Browse files
committed
add gi_code builtin property for generators - get access to code attributes like co_cellvars / co_freevars
1 parent 6d9d321 commit e2ed64d

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_generators.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,11 @@ def f():
168168

169169
if sys.version_info.minor == 4 and sys.version_info.micro < 3:
170170
del ExceptionTest
171+
172+
173+
def test_unboundlocalerror_gen():
174+
def func(args):
175+
args = (arg for arg in args)
176+
return set(args)
177+
178+
assert func([1, 2, 3, 4]) == {1, 2, 3, 4}

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
@@ -27,6 +27,7 @@
2727

2828
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ITER__;
2929
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NEXT__;
30+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
3031
import static com.oracle.graal.python.runtime.exception.PythonErrorType.StopIteration;
3132
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
3233

@@ -45,6 +46,7 @@
4546
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4647
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
4748
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
49+
import com.oracle.graal.python.runtime.PythonParseResult;
4850
import com.oracle.graal.python.runtime.exception.PException;
4951
import com.oracle.truffle.api.dsl.Cached;
5052
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -173,4 +175,19 @@ Object sendThrow(PGenerator self, @SuppressWarnings("unused") PythonClass typ, P
173175
return resumeGenerator(self);
174176
}
175177
}
178+
179+
@Builtin(name = "gi_code", minNumOfArguments = 1, maxNumOfArguments = 2, isGetter = true, isSetter = true)
180+
@GenerateNodeFactory
181+
public abstract static class GetCodeNode extends PythonBuiltinNode {
182+
@Specialization(guards = {"isNoValue(none)"})
183+
Object getCode(PGenerator self, @SuppressWarnings("unused") PNone none) {
184+
return new PythonParseResult(self.getGeneratorRootNode(), getCore());
185+
}
186+
187+
@SuppressWarnings("unused")
188+
@Specialization
189+
Object setCode(PGenerator self, PythonParseResult code) {
190+
throw raise(NotImplementedError, "setting gi_code");
191+
}
192+
}
176193
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.oracle.truffle.api.frame.FrameDescriptor;
3737
import com.oracle.truffle.api.frame.FrameSlot;
3838
import com.oracle.truffle.api.frame.MaterializedFrame;
39+
import com.oracle.truffle.api.nodes.RootNode;
3940

4041
public final class PGenerator extends PythonBuiltinObject {
4142

@@ -92,6 +93,10 @@ public RootCallTarget getCallTarget() {
9293
return callTarget;
9394
}
9495

96+
public RootNode getGeneratorRootNode() {
97+
return callTarget.getRootNode();
98+
}
99+
95100
public Object[] getArguments() {
96101
return arguments;
97102
}

0 commit comments

Comments
 (0)