| 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) |