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)