diff options
Diffstat (limited to 'Lib/symtable.py')
-rw-r--r-- | Lib/symtable.py | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/Lib/symtable.py b/Lib/symtable.py index 089c8dc..ff332f2 100644 --- a/Lib/symtable.py +++ b/Lib/symtable.py @@ -1,10 +1,11 @@ """Interface to the compiler's internal symbol tables""" import _symtable -from _symtable import USE, DEF_GLOBAL, DEF_LOCAL, DEF_PARAM, \ - DEF_STAR, DEF_DOUBLESTAR, DEF_INTUPLE, DEF_FREE, \ - DEF_FREE_GLOBAL, DEF_FREE_CLASS, DEF_IMPORT, DEF_BOUND, \ - OPT_IMPORT_STAR +from _symtable import (USE, DEF_GLOBAL, DEF_LOCAL, DEF_PARAM, + DEF_STAR, DEF_DOUBLESTAR, DEF_INTUPLE, DEF_FREE, + DEF_FREE_GLOBAL, DEF_FREE_CLASS, DEF_IMPORT, DEF_BOUND, + OPT_IMPORT_STAR, SCOPE_OFF, SCOPE_MASK, FREE, + GLOBAL_IMPLICIT, GLOBAL_EXPLICIT) import weakref @@ -38,15 +39,9 @@ class SymbolTableFactory: newSymbolTable = SymbolTableFactory() -def is_free(flags): - if (flags & (USE | DEF_FREE)) \ - and (flags & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)): - return True - if flags & DEF_FREE_CLASS: - return True - return False -class SymbolTable: +class SymbolTable(object): + def __init__(self, raw_table, filename): self._table = raw_table self._filename = filename @@ -59,10 +54,11 @@ class SymbolTable: kind = "%s " % self.__class__.__name__ if self._table.name == "global": - return "<%sSymbolTable for module %s>" % (kind, self._filename) + return "<{0}SymbolTable for module {1}>".format(kind, self._filename) else: - return "<%sSymbolTable for %s in %s>" % (kind, self._table.name, - self._filename) + return "<{0}SymbolTable for {1} in {2}>".format(kind, + self._table.name, + self._filename) def get_type(self): if self._table.type == _symtable.TYPE_MODULE: @@ -72,7 +68,7 @@ class SymbolTable: if self._table.type == _symtable.TYPE_CLASS: return "class" assert self._table.type in (1, 2, 3), \ - "unexpected type: %s" % self._table.type + "unexpected type: {0}".format(self._table.type) def get_id(self): return self._table.id @@ -124,6 +120,7 @@ class SymbolTable: return [newSymbolTable(st, self._filename) for st in self._table.children] + class Function(SymbolTable): # Default values for instance variables @@ -148,15 +145,18 @@ class Function(SymbolTable): def get_globals(self): if self.__globals is None: - glob = DEF_GLOBAL | DEF_FREE_GLOBAL - self.__globals = self.__idents_matching(lambda x:x & glob) + glob = (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT) + test = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) in glob + self.__globals = self.__idents_matching(test) return self.__globals def get_frees(self): if self.__frees is None: + is_free = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) == FREE self.__frees = self.__idents_matching(is_free) return self.__frees + class Class(SymbolTable): __methods = None @@ -169,14 +169,17 @@ class Class(SymbolTable): self.__methods = tuple(d) return self.__methods -class Symbol: + +class Symbol(object): + def __init__(self, name, flags, namespaces=None): self.__name = name self.__flags = flags + self.__scope = (flags >> SCOPE_OFF) & SCOPE_MASK # like PyST_GetScope() self.__namespaces = namespaces or () def __repr__(self): - return "<symbol '%s'>" % self.__name + return "<symbol {0!r}>".format(self.__name) def get_name(self): return self.__name @@ -188,8 +191,7 @@ class Symbol: return bool(self.__flags & DEF_PARAM) def is_global(self): - return bool((self.__flags & DEF_GLOBAL) - or (self.__flags & DEF_FREE_GLOBAL)) + return bool(self.__scope in (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT)) def is_vararg(self): return bool(self.__flags & DEF_STAR) @@ -201,12 +203,7 @@ class Symbol: return bool(self.__flags & DEF_BOUND) def is_free(self): - if (self.__flags & (USE | DEF_FREE)) \ - and (self.__flags & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)): - return True - if self.__flags & DEF_FREE_CLASS: - return True - return False + return bool(self.__scope == FREE) def is_imported(self): return bool(self.__flags & DEF_IMPORT) |