You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.8 KiB
67 lines
1.8 KiB
import csv
|
|
import os.path
|
|
|
|
from c_analyzer.parser.declarations import extract_storage
|
|
from c_analyzer.variables import known as _common
|
|
from c_analyzer.variables.info import Variable
|
|
|
|
from . import DATA_DIR
|
|
|
|
|
|
# XXX need tests:
|
|
# * from_file()
|
|
# * look_up_variable()
|
|
|
|
|
|
DATA_FILE = os.path.join(DATA_DIR, 'known.tsv')
|
|
|
|
|
|
def _get_storage(decl, infunc):
|
|
# statics
|
|
if decl.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')):
|
|
return 'static'
|
|
if decl.startswith(('_Py_IDENTIFIER(', '_Py_static_string(')):
|
|
return 'static'
|
|
if decl.startswith('PyDoc_VAR('):
|
|
return 'static'
|
|
if decl.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')):
|
|
return 'static'
|
|
if decl.startswith('WRAP_METHOD('):
|
|
return 'static'
|
|
# public extern
|
|
if decl.startswith('PyAPI_DATA('):
|
|
return 'extern'
|
|
# Fall back to the normal handler.
|
|
return extract_storage(decl, infunc=infunc)
|
|
|
|
|
|
def _handle_var(varid, decl):
|
|
# if varid.name == 'id' and decl == UNKNOWN:
|
|
# # None of these are variables.
|
|
# decl = 'int id';
|
|
storage = _get_storage(decl, varid.funcname)
|
|
return Variable(varid, storage, decl)
|
|
|
|
|
|
def from_file(infile=DATA_FILE, *,
|
|
_from_file=_common.from_file,
|
|
_handle_var=_handle_var,
|
|
):
|
|
"""Return the info for known declarations in the given file."""
|
|
return _from_file(infile, handle_var=_handle_var)
|
|
|
|
|
|
def look_up_variable(varid, knownvars, *,
|
|
_lookup=_common.look_up_variable,
|
|
):
|
|
"""Return the known variable matching the given ID.
|
|
|
|
"knownvars" is a mapping of ID to Variable.
|
|
|
|
"match_files" is used to verify if two filenames point to
|
|
the same file.
|
|
|
|
If no match is found then None is returned.
|
|
"""
|
|
return _lookup(varid, knownvars)
|