Skip to content

Commit 718251c

Browse files
committed
Readd no-frame code path to generator resume node
1 parent fca61cf commit 718251c

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

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

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@
7979
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
8080
import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
8181
import com.oracle.graal.python.runtime.ExecutionContext;
82+
import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext;
83+
import com.oracle.graal.python.runtime.PythonContext;
84+
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
8285
import com.oracle.graal.python.runtime.PythonOptions;
8386
import com.oracle.graal.python.runtime.exception.PException;
8487
import com.oracle.graal.python.runtime.object.PFactory;
@@ -180,9 +183,20 @@ static Object cachedBytecodeDSL(VirtualFrame frame, Node inliningTarget, PGenera
180183
* generator root.
181184
*/
182185
MaterializedFrame generatorFrame = self.getGeneratorFrame();
183-
callContext.executePrepareCall(frame, generatorFrame.getArguments(), rootNode.getCallerFlags());
184186
Object[] arguments = new Object[]{generatorFrame, sendValue};
185-
generatorResult = callNode.call(arguments);
187+
if (frame == null) {
188+
PythonContext context = PythonContext.get(inliningTarget);
189+
PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget));
190+
Object state = IndirectCalleeContext.enter(threadState, generatorFrame.getArguments());
191+
try {
192+
generatorResult = callNode.call(arguments);
193+
} finally {
194+
IndirectCalleeContext.exit(threadState, state);
195+
}
196+
} else {
197+
callContext.executePrepareCall(frame, generatorFrame.getArguments(), rootNode.getCallerFlags());
198+
generatorResult = callNode.call(arguments);
199+
}
186200
} catch (PException e) {
187201
throw handleException(self, inliningTarget, errorProfile, raiseNode, e);
188202
} finally {
@@ -236,9 +250,20 @@ static Object genericBytecodeDSL(VirtualFrame frame, Node inliningTarget, PGener
236250
// See the cached specialization for notes about the arguments handling
237251
PRootNode rootNode = PGenerator.unwrapContinuationRoot((ContinuationRootNode) callTarget.getRootNode());
238252
MaterializedFrame generatorFrame = self.getGeneratorFrame();
239-
callContext.executePrepareCall(frame, generatorFrame.getArguments(), rootNode.getCallerFlags());
240253
Object[] arguments = new Object[]{generatorFrame, sendValue};
241-
generatorResult = callNode.call(callTarget, arguments);
254+
if (frame == null) {
255+
PythonContext context = PythonContext.get(inliningTarget);
256+
PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget));
257+
Object state = IndirectCalleeContext.enter(threadState, generatorFrame.getArguments());
258+
try {
259+
generatorResult = callNode.call(callTarget, arguments);
260+
} finally {
261+
IndirectCalleeContext.exit(threadState, state);
262+
}
263+
} else {
264+
callContext.executePrepareCall(frame, generatorFrame.getArguments(), rootNode.getCallerFlags());
265+
generatorResult = callNode.call(callTarget, arguments);
266+
}
242267
} catch (PException e) {
243268
throw handleException(self, inliningTarget, errorProfile, raiseNode, e);
244269
} finally {

0 commit comments

Comments
 (0)