Skip to content

Commit f4e4ded

Browse files
committed
Fixing problem, when is deserialized generator.
1 parent a8d0499 commit f4e4ded

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/GeneratorFunctionDefinitionNode.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.graal.python.nodes.generator.GeneratorFunctionRootNode;
3939
import com.oracle.graal.python.parser.DefinitionCellSlots;
4040
import com.oracle.graal.python.parser.ExecutionCellSlots;
41+
import com.oracle.graal.python.runtime.PythonContext;
4142
import com.oracle.truffle.api.CompilerAsserts;
4243
import com.oracle.truffle.api.CompilerDirectives;
4344
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -99,12 +100,18 @@ public PGeneratorFunction execute(VirtualFrame frame) {
99100
kwDefaultValues));
100101
}
101102

103+
public GeneratorFunctionRootNode getGeneratorFunctionRootNode(PythonContext ctx) {
104+
if (generatorCallTarget == null) {
105+
return new GeneratorFunctionRootNode(ctx.getLanguage(), callTarget, functionName, frameDescriptor,
106+
executionCellSlots, ((PRootNode) callTarget.getRootNode()).getSignature(), numOfActiveFlags, numOfGeneratorBlockNode, numOfGeneratorForNode, numOfGeneratorTryNode);
107+
}
108+
return (GeneratorFunctionRootNode) generatorCallTarget.getRootNode();
109+
}
110+
102111
protected PCode getGeneratorCode() {
103112
if (generatorCallTarget == null) {
104113
CompilerDirectives.transferToInterpreterAndInvalidate();
105-
GeneratorFunctionRootNode generatorFunctionRootNode = new GeneratorFunctionRootNode(getContext().getLanguage(), callTarget, functionName, frameDescriptor,
106-
executionCellSlots, ((PRootNode) callTarget.getRootNode()).getSignature(), numOfActiveFlags, numOfGeneratorBlockNode, numOfGeneratorForNode, numOfGeneratorTryNode);
107-
generatorCallTarget = Truffle.getRuntime().createCallTarget(generatorFunctionRootNode);
114+
generatorCallTarget = Truffle.getRuntime().createCallTarget(getGeneratorFunctionRootNode(getContext()));
108115
}
109116
PythonLanguage lang = lookupLanguageReference(PythonLanguage.class).get();
110117
CompilerAsserts.partialEvaluationConstant(lang);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/parser/PythonParserImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
3232
import com.oracle.graal.python.nodes.ModuleRootNode;
3333
import com.oracle.graal.python.nodes.function.FunctionDefinitionNode;
34-
import com.oracle.graal.python.nodes.generator.GeneratorFunctionRootNode;
34+
import com.oracle.graal.python.nodes.function.GeneratorFunctionDefinitionNode;
3535
import com.oracle.graal.python.nodes.util.BadOPCodeNode;
3636
import org.antlr.v4.runtime.CharStreams;
3737
import org.antlr.v4.runtime.CommonTokenStream;
@@ -188,11 +188,11 @@ public RootNode deserialize(Source source, byte[] data, String[] cellvars, Strin
188188
// find function RootNode
189189
final Node[] fromVisitor = new Node[1];
190190
result.accept((Node node) -> {
191-
if (node instanceof FunctionDefinitionNode) {
192-
fromVisitor[0] = ((FunctionDefinitionNode) node).getFunctionRoot();
191+
if (node instanceof GeneratorFunctionDefinitionNode) {
192+
fromVisitor[0] = ((GeneratorFunctionDefinitionNode) node).getGeneratorFunctionRootNode(PythonLanguage.getContext());
193193
return false;
194-
} else if (node instanceof GeneratorFunctionRootNode) {
195-
fromVisitor[0] = ((GeneratorFunctionRootNode) node).getFunctionRootNode();
194+
} else if (node instanceof FunctionDefinitionNode) {
195+
fromVisitor[0] = ((FunctionDefinitionNode) node).getFunctionRoot();
196196
return false;
197197
}
198198
return true;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/parser/PythonSSTNodeFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.oracle.graal.python.parser.sst.FactorySSTVisitor;
6363
import com.oracle.graal.python.parser.sst.ForComprehensionSSTNode;
6464
import com.oracle.graal.python.parser.sst.ForSSTNode;
65+
import com.oracle.graal.python.parser.sst.FunctionDefSSTNode;
6566
import com.oracle.graal.python.parser.sst.GeneratorFactorySSTVisitor;
6667
import com.oracle.graal.python.parser.sst.ImportFromSSTNode;
6768
import com.oracle.graal.python.parser.sst.ImportSSTNode;
@@ -253,6 +254,13 @@ public Node createParserResult(SSTNode parserSSTResult, PythonParser.ParserMode
253254
isGen = true;
254255
scopeEnvironment.setCurrentScope(new ScopeInfo("evalgen", ScopeKind.Generator, useFrame.getFrameDescriptor(), scopeEnvironment.getGlobalScope()));
255256
} else {
257+
if (mode == PythonParser.ParserMode.Deserialization && parserSSTResult instanceof FunctionDefSSTNode) {
258+
// we need to chek, if the deserialized function is not generator
259+
FunctionDefSSTNode fDef = (FunctionDefSSTNode) parserSSTResult;
260+
if (fDef.getScope().getScopeKind() == ScopeKind.Generator) {
261+
isGen = true;
262+
}
263+
}
256264
scopeEnvironment.setCurrentScope(scopeEnvironment.getGlobalScope());
257265
}
258266
scopeEnvironment.setFreeVarsInRootScope(useFrame);

0 commit comments

Comments
 (0)