Files
openide/python/helpers/pydev/_pydevd_bundle/pydevd_bytecode_utils.py
Andrey Lisin 5537341b76 PY-72239 Fix Python 2.7 smart stepping for some cases
GitOrigin-RevId: c2baa98e4514fec5e3b9a034b61a5ca3e1d2eb5d
2024-04-29 20:00:32 +00:00

54 lines
1.5 KiB
Python

"""Bytecode analyzing utils."""
from _pydevd_bundle.smart_step_into import get_stepping_variants
__all__ = [
'find_last_call_name',
'find_last_func_call_order',
]
def find_last_func_call_order(frame, start_line):
"""Find the call order of the last function call between ``start_line``
and last executed instruction.
:param frame: A frame inside which we are looking for the function call.
:type frame: :py:class:`types.FrameType`
:param start_line:
:return: call order or -1 if we fail to find the call order for some
reason.
:rtype: int
"""
code = frame.f_code
lasti = frame.f_lasti
cache = {}
call_order = -1
for inst in get_stepping_variants(code):
if inst.offset > lasti:
break
if inst.lineno >= start_line:
name = inst.argval
call_order = cache.setdefault(name, -1)
call_order += 1
cache[name] = call_order
return call_order
def find_last_call_name(frame):
"""Find the name of the last call made in the frame.
:param frame: A frame inside which we are looking the last call.
:type frame: :py:class:`types.FrameType`
:return: The name of a function or method that has been called last.
:rtype: str
"""
last_call_name = None
code = frame.f_code
last_instruction = frame.f_lasti
for inst in get_stepping_variants(code):
if inst.offset > last_instruction:
break
last_call_name = inst.argval
return last_call_name