mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 e4c431ecf5
			
		
	
	
		e4c431ecf5
		
			
		
	
	
	
	
		
			
			This is partly a cleanup of the code. It also is preparation for getting the variables from the source (cross-platform) rather than from the symbols. The change only touches the tool (and its tests).
		
			
				
	
	
		
			75 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			75 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)
 |