76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
from ..common import files
|
|
from ..common.info import UNKNOWN
|
|
from ..parser import (
|
|
find as p_find,
|
|
)
|
|
from ..symbols import (
|
|
info as s_info,
|
|
find as s_find,
|
|
)
|
|
from .info import Variable
|
|
|
|
# XXX need tests:
|
|
# * vars_from_source
|
|
|
|
|
|
def _remove_cached(cache, var):
|
|
if not cache:
|
|
return
|
|
try:
|
|
cached = cache[var.filename]
|
|
cached.remove(var)
|
|
except (KeyError, IndexError):
|
|
pass
|
|
|
|
|
|
def vars_from_binary(binfile, *,
|
|
known=None,
|
|
filenames=None,
|
|
handle_id=None,
|
|
check_filename=None,
|
|
handle_var=Variable.from_id,
|
|
_iter_vars=s_find.variables,
|
|
_get_symbol_resolver=s_find.get_resolver,
|
|
):
|
|
"""Yield a Variable for each found Symbol.
|
|
|
|
Details are filled in from the given "known" variables and types.
|
|
"""
|
|
cache = {}
|
|
resolve = _get_symbol_resolver(filenames, known,
|
|
handle_var=handle_var,
|
|
check_filename=check_filename,
|
|
perfilecache=cache,
|
|
)
|
|
for var, symbol in _iter_vars(binfile,
|
|
resolve=resolve,
|
|
handle_id=handle_id,
|
|
):
|
|
if var is None:
|
|
var = Variable(symbol.id, UNKNOWN, UNKNOWN)
|
|
yield var
|
|
_remove_cached(cache, var)
|
|
|
|
|
|
def vars_from_source(filenames, *,
|
|
preprocessed=None,
|
|
known=None,
|
|
handle_id=None,
|
|
handle_var=Variable.from_id,
|
|
iter_vars=p_find.variables,
|
|
):
|
|
"""Yield a Variable for each declaration in the raw source code.
|
|
|
|
Details are filled in from the given "known" variables and types.
|
|
"""
|
|
cache = {}
|
|
for varid, decl in iter_vars(filenames or (),
|
|
perfilecache=cache,
|
|
preprocessed=preprocessed,
|
|
known=known,
|
|
handle_id=handle_id,
|
|
):
|
|
var = handle_var(varid, decl)
|
|
yield var
|
|
_remove_cached(cache, var)
|