mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	get the symtable module back in working order
- Fix broken functions - Add (hopefully) extensive tests - Modernize a little
This commit is contained in:
		
							parent
							
								
									fd7c43e7be
								
							
						
					
					
						commit
						7dd854725b
					
				
					 3 changed files with 188 additions and 48 deletions
				
			
		|  | @ -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, OPT_EXEC, OPT_BARE_EXEC | ||||
| 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, OPT_EXEC, OPT_BARE_EXEC, SCOPE_OFF, SCOPE_MASK, | ||||
|      FREE, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT) | ||||
| 
 | ||||
| import weakref | ||||
| 
 | ||||
|  | @ -38,15 +39,9 @@ def __call__(self, table, filename): | |||
| 
 | ||||
| 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 @@ def __repr__(self): | |||
|             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 @@ def get_type(self): | |||
|         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 @@ def get_children(self): | |||
|         return [newSymbolTable(st, self._filename) | ||||
|                 for st in self._table.children] | ||||
| 
 | ||||
| 
 | ||||
| class Function(SymbolTable): | ||||
| 
 | ||||
|     # Default values for instance variables | ||||
|  | @ -148,15 +145,18 @@ def get_locals(self): | |||
| 
 | ||||
|     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 @@ def get_methods(self): | |||
|             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 @@ def is_parameter(self): | |||
|         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 @@ def is_local(self): | |||
|         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) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Benjamin Peterson
						Benjamin Peterson