mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			76 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from ..common import files | ||
|  | from ..common.info import UNKNOWN | ||
|  | from ..parser import ( | ||
|  |         find as p_find, | ||
|  |         ) | ||
|  | from ..symbols import ( | ||
|  |         info as s_info, | ||
|  |         find as s_find, | ||
|  |         ) | ||
|  | from .info import Variable | ||
|  | 
 | ||
|  | # XXX need tests: | ||
|  | # * vars_from_source | ||
|  | 
 | ||
|  | 
 | ||
|  | def _remove_cached(cache, var): | ||
|  |     if not cache: | ||
|  |         return | ||
|  |     try: | ||
|  |         cached = cache[var.filename] | ||
|  |         cached.remove(var) | ||
|  |     except (KeyError, IndexError): | ||
|  |         pass | ||
|  | 
 | ||
|  | 
 | ||
|  | def vars_from_binary(binfile, *, | ||
|  |                      known=None, | ||
|  |                      filenames=None, | ||
|  |                      handle_id=None, | ||
|  |                      check_filename=None, | ||
|  |                      handle_var=Variable.from_id, | ||
|  |                      _iter_vars=s_find.variables, | ||
|  |                      _get_symbol_resolver=s_find.get_resolver, | ||
|  |                      ): | ||
|  |     """Yield a Variable for each found Symbol.
 | ||
|  | 
 | ||
|  |     Details are filled in from the given "known" variables and types. | ||
|  |     """
 | ||
|  |     cache = {} | ||
|  |     resolve = _get_symbol_resolver(filenames, known, | ||
|  |                                    handle_var=handle_var, | ||
|  |                                    check_filename=check_filename, | ||
|  |                                    perfilecache=cache, | ||
|  |                                    ) | ||
|  |     for var, symbol in _iter_vars(binfile, | ||
|  |                                   resolve=resolve, | ||
|  |                                   handle_id=handle_id, | ||
|  |                                   ): | ||
|  |         if var is None: | ||
|  |             var = Variable(symbol.id, UNKNOWN, UNKNOWN) | ||
|  |         yield var | ||
|  |         _remove_cached(cache, var) | ||
|  | 
 | ||
|  | 
 | ||
|  | def vars_from_source(filenames, *, | ||
|  |                      preprocessed=None, | ||
|  |                      known=None, | ||
|  |                      handle_id=None, | ||
|  |                      handle_var=Variable.from_id, | ||
|  |                      iter_vars=p_find.variables, | ||
|  |                      ): | ||
|  |     """Yield a Variable for each declaration in the raw source code.
 | ||
|  | 
 | ||
|  |     Details are filled in from the given "known" variables and types. | ||
|  |     """
 | ||
|  |     cache = {} | ||
|  |     for varid, decl in iter_vars(filenames or (), | ||
|  |                                  perfilecache=cache, | ||
|  |                                  preprocessed=preprocessed, | ||
|  |                                  known=known, | ||
|  |                                  handle_id=handle_id, | ||
|  |                                  ): | ||
|  |         var = handle_var(varid, decl) | ||
|  |         yield var | ||
|  |         _remove_cached(cache, var) |