@@ -171,13 +171,17 @@ public final PFrame getFrameForReference(Frame frame, PFrame.Reference startFram
171171 }
172172
173173 public final PFrame getFrameForReference (Frame frame , PFrame .Reference startFrameInfo , FrameSelector selector , int level , int callerFlags ) {
174- return execute (frame , startFrameInfo , FrameInstance . FrameAccess . READ_ONLY , selector , level , callerFlags | CallerFlags . NEEDS_PFRAME );
174+ return getFrameForReference (frame , startFrameInfo , selector , level , callerFlags , null );
175175 }
176176
177- protected abstract PFrame execute (Frame frame , PFrame .Reference startFrameInfo , FrameInstance .FrameAccess frameAccess , FrameSelector selector , int level , int callerFlags );
177+ public final PFrame getFrameForReference (Frame frame , PFrame .Reference startFrameInfo , FrameSelector selector , int level , int callerFlags , Thread frameThread ) {
178+ return execute (frame , startFrameInfo , FrameInstance .FrameAccess .READ_ONLY , selector , level , callerFlags | CallerFlags .NEEDS_PFRAME , frameThread );
179+ }
180+
181+ protected abstract PFrame execute (Frame frame , PFrame .Reference startFrameInfo , FrameInstance .FrameAccess frameAccess , FrameSelector selector , int level , int callerFlags , Thread frameThread );
178182
179183 @ Specialization
180- PFrame read (VirtualFrame frame , PFrame .Reference startFrameInfo , FrameInstance .FrameAccess frameAccess , FrameSelector selector , int level , int callerFlags ,
184+ PFrame read (VirtualFrame frame , PFrame .Reference startFrameInfo , FrameInstance .FrameAccess frameAccess , FrameSelector selector , int level , int callerFlags , Thread frameThread ,
181185 @ Bind Node inliningTarget ,
182186 @ Cached MaterializeFrameNode materializeFrameNode ,
183187 @ Cached InlinedBranchProfile stackWalkProfile1 ,
@@ -233,17 +237,16 @@ PFrame read(VirtualFrame frame, PFrame.Reference startFrameInfo, FrameInstance.F
233237 * It is necessary to continue from where we stopped with the backref walk because the
234238 * original starting frame might not be on stack anymore
235239 */
236- return readSlowPath (curFrameInfo , frameAccess , selector , level - i , callerFlags , materializeFrameNode );
240+ return readSlowPath (curFrameInfo , frameAccess , selector , level - i , callerFlags , frameThread , materializeFrameNode );
237241 }
238242
239243 @ TruffleBoundary
240244 @ SuppressWarnings ("try" )
241- private PFrame readSlowPath (PFrame .Reference startFrameInfo , FrameInstance .FrameAccess frameAccess , FrameSelector selector , int level , int callerFlags ,
245+ private PFrame readSlowPath (PFrame .Reference startFrameInfo , FrameInstance .FrameAccess frameAccess , FrameSelector selector , int level , int callerFlags , Thread frameThread ,
242246 MaterializeFrameNode materializeFrameNode ) {
243- if ( level == 0 && startFrameInfo != null && startFrameInfo . getPyFrame () != null && ! selector . skip ( startFrameInfo . getRootNode ()) && startFrameInfo . getPyFrame (). getThread () != null &&
244- startFrameInfo . getPyFrame (). getThread () != Thread .currentThread ()) {
247+ Thread thread = getFrameThread ( startFrameInfo , frameThread );
248+ if ( level == 0 && startFrameInfo != null && ! selector . skip ( startFrameInfo . getRootNode ()) && thread != null && thread != Thread .currentThread ()) {
245249 // We have the frame we're looking for, but it's on another thread
246- Thread thread = startFrameInfo .getPyFrame ().getThread ();
247250 if (thread .isAlive ()) {
248251 try (var gil = GilNode .uncachedRelease ()) {
249252 // Schedule a safepoint action on that thread
@@ -272,13 +275,23 @@ protected void perform(Access access) {
272275 }, future );
273276 }
274277 }
275- assert !startFrameInfo .getPyFrame ().outdatedCallerFlags (callerFlags );
276- return startFrameInfo .getPyFrame ();
278+ PFrame pyFrame = startFrameInfo .getPyFrame ();
279+ if (pyFrame != null ) {
280+ assert !pyFrame .outdatedCallerFlags (callerFlags );
281+ return pyFrame ;
282+ }
277283 }
278284 StackWalkResult callerFrameResult = getFrame (this , startFrameInfo , frameAccess , selector , level , callerFlags );
279285 return processStackWalkResult (materializeFrameNode , callerFlags , callerFrameResult );
280286 }
281287
288+ private static Thread getFrameThread (PFrame .Reference startFrameInfo , Thread frameThread ) {
289+ if (startFrameInfo != null && startFrameInfo .getPyFrame () != null ) {
290+ return startFrameInfo .getPyFrame ().getThread ();
291+ }
292+ return frameThread ;
293+ }
294+
282295 private static PFrame processStackWalkResult (MaterializeFrameNode materializeFrameNode , int callerFlags , StackWalkResult callerFrameResult ) {
283296 if (callerFrameResult != null ) {
284297 Node location = callerFrameResult .callNode ;
0 commit comments