mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 22:51:17 +07:00
54 lines
1.5 KiB
Python
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
|