|
79 | 79 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; |
80 | 80 | import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; |
81 | 81 | 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; |
82 | 85 | import com.oracle.graal.python.runtime.PythonOptions; |
83 | 86 | import com.oracle.graal.python.runtime.exception.PException; |
84 | 87 | import com.oracle.graal.python.runtime.object.PFactory; |
@@ -180,9 +183,20 @@ static Object cachedBytecodeDSL(VirtualFrame frame, Node inliningTarget, PGenera |
180 | 183 | * generator root. |
181 | 184 | */ |
182 | 185 | MaterializedFrame generatorFrame = self.getGeneratorFrame(); |
183 | | - callContext.executePrepareCall(frame, generatorFrame.getArguments(), rootNode.getCallerFlags()); |
184 | 186 | 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 | + } |
186 | 200 | } catch (PException e) { |
187 | 201 | throw handleException(self, inliningTarget, errorProfile, raiseNode, e); |
188 | 202 | } finally { |
@@ -236,9 +250,20 @@ static Object genericBytecodeDSL(VirtualFrame frame, Node inliningTarget, PGener |
236 | 250 | // See the cached specialization for notes about the arguments handling |
237 | 251 | PRootNode rootNode = PGenerator.unwrapContinuationRoot((ContinuationRootNode) callTarget.getRootNode()); |
238 | 252 | MaterializedFrame generatorFrame = self.getGeneratorFrame(); |
239 | | - callContext.executePrepareCall(frame, generatorFrame.getArguments(), rootNode.getCallerFlags()); |
240 | 253 | 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 | + } |
242 | 267 | } catch (PException e) { |
243 | 268 | throw handleException(self, inliningTarget, errorProfile, raiseNode, e); |
244 | 269 | } finally { |
|
0 commit comments