mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Issue #999042: The Python compiler now handles explict global statements
correctly (should be assigned using STORE_GLOBAL opcode). This was done by having the system table differentiate between explict and implicit globals.
This commit is contained in:
		
							parent
							
								
									98c3b85bc4
								
							
						
					
					
						commit
						92c3b2190b
					
				
					 4 changed files with 18 additions and 10 deletions
				
			
		|  | @ -1,7 +1,8 @@ | |||
| """Module symbol-table generator""" | ||||
| 
 | ||||
| from compiler import ast | ||||
| from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL, SC_UNKNOWN | ||||
| from compiler.consts import SC_LOCAL, SC_GLOBAL_IMPLICIT, SC_GLOBAL_EXPLICT, \ | ||||
|     SC_FREE, SC_CELL, SC_UNKNOWN | ||||
| from compiler.misc import mangle | ||||
| import types | ||||
| 
 | ||||
|  | @ -89,7 +90,7 @@ def check_name(self, name): | |||
|         The scope of a name could be LOCAL, GLOBAL, FREE, or CELL. | ||||
|         """ | ||||
|         if name in self.globals: | ||||
|             return SC_GLOBAL | ||||
|             return SC_GLOBAL_EXPLICT | ||||
|         if name in self.cells: | ||||
|             return SC_CELL | ||||
|         if name in self.defs: | ||||
|  | @ -99,7 +100,7 @@ def check_name(self, name): | |||
|         if self.nested: | ||||
|             return SC_UNKNOWN | ||||
|         else: | ||||
|             return SC_GLOBAL | ||||
|             return SC_GLOBAL_IMPLICIT | ||||
| 
 | ||||
|     def get_free_vars(self): | ||||
|         if not self.nested: | ||||
|  | @ -152,7 +153,7 @@ def add_frees(self, names): | |||
|                 if sc == SC_UNKNOWN or sc == SC_FREE \ | ||||
|                    or isinstance(self, ClassScope): | ||||
|                     self.frees[name] = 1 | ||||
|                 elif sc == SC_GLOBAL: | ||||
|                 elif sc == SC_GLOBAL_IMPLICIT: | ||||
|                     child_globals.append(name) | ||||
|                 elif isinstance(self, FunctionScope) and sc == SC_LOCAL: | ||||
|                     self.cells[name] = 1 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Neil Schemenauer
						Neil Schemenauer