@@ -163,15 +163,18 @@ PyUnstable_InterpreterFrame_GetLineSafe(struct _PyInterpreterFrame *frame)
163163 if (code == NULL ) {
164164 return -1 ;
165165 }
166- int addr = _PyInterpreterFrame_LASTI (frame ) * sizeof (_Py_CODEUNIT );
166+ _Py_CODEUNIT * bytecode = _PyFrame_SafeGetBytecode (frame , code );
167+ if (bytecode == NULL ) {
168+ return -1 ;
169+ }
170+ int addr = (int )(frame -> instr_ptr - bytecode ) * sizeof (_Py_CODEUNIT );
167171 return _PyCode_SafeAddr2Line (code , addr );
168172}
169173
170174
171- struct _PyInterpreterFrame * _Py_NO_SANITIZE_THREAD
172- PyUnstable_ThreadState_GetInterpreterFrame ( PyThreadState * tstate )
175+ static _PyInterpreterFrame * _Py_NO_SANITIZE_THREAD
176+ _first_complete_frame ( _PyInterpreterFrame * frame )
173177{
174- _PyInterpreterFrame * frame = tstate -> current_frame ;
175178 while (frame != NULL ) {
176179 if (_PyMem_IsPtrFreed (frame )) {
177180 return NULL ;
@@ -184,20 +187,16 @@ PyUnstable_ThreadState_GetInterpreterFrame(PyThreadState *tstate)
184187 return NULL ;
185188}
186189
190+ struct _PyInterpreterFrame * _Py_NO_SANITIZE_THREAD
191+ PyUnstable_ThreadState_GetInterpreterFrame (PyThreadState * tstate )
192+ {
193+ return _first_complete_frame (tstate -> current_frame );
194+ }
195+
187196struct _PyInterpreterFrame * _Py_NO_SANITIZE_THREAD
188197PyUnstable_InterpreterFrame_GetNextComplete (struct _PyInterpreterFrame * frame )
189198{
190- _PyInterpreterFrame * previous = frame -> previous ;
191- while (previous != NULL ) {
192- if (_PyMem_IsPtrFreed (previous )) {
193- return NULL ;
194- }
195- if (!_PyFrame_IsIncomplete (previous )) {
196- return previous ;
197- }
198- previous = previous -> previous ;
199- }
200- return NULL ;
199+ return _first_complete_frame (frame -> previous );
201200}
202201
203202const PyTypeObject * const PyUnstable_ExecutableKinds [PyUnstable_EXECUTABLE_KINDS + 1 ] = {
0 commit comments