diff options
author | Neil Schemenauer <nascheme@enme.ucalgary.ca> | 2009-02-07 00:54:41 (GMT) |
---|---|---|
committer | Neil Schemenauer <nascheme@enme.ucalgary.ca> | 2009-02-07 00:54:41 (GMT) |
commit | 92c3b2190bae6dd7844c83b6acefc0b89d2bc225 (patch) | |
tree | 0cb1e4a65dab9e1ee5f24409d6c758ebc44bb3ba /Lib | |
parent | 98c3b85bc4b64307fc12b53210f941c6458bccb5 (diff) | |
download | cpython-92c3b2190bae6dd7844c83b6acefc0b89d2bc225.zip cpython-92c3b2190bae6dd7844c83b6acefc0b89d2bc225.tar.gz cpython-92c3b2190bae6dd7844c83b6acefc0b89d2bc225.tar.bz2 |
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.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/compiler/consts.py | 9 | ||||
-rw-r--r-- | Lib/compiler/pycodegen.py | 7 | ||||
-rw-r--r-- | Lib/compiler/symbols.py | 9 |
3 files changed, 15 insertions, 10 deletions
diff --git a/Lib/compiler/consts.py b/Lib/compiler/consts.py index dd42793..022f6da 100644 --- a/Lib/compiler/consts.py +++ b/Lib/compiler/consts.py @@ -4,10 +4,11 @@ OP_DELETE = 'OP_DELETE' OP_APPLY = 'OP_APPLY' SC_LOCAL = 1 -SC_GLOBAL = 2 -SC_FREE = 3 -SC_CELL = 4 -SC_UNKNOWN = 5 +SC_GLOBAL_IMPLICIT = 2 +SC_GLOBAL_EXPLICT = 3 +SC_FREE = 4 +SC_CELL = 5 +SC_UNKNOWN = 6 CO_OPTIMIZED = 0x0001 CO_NEWLOCALS = 0x0002 diff --git a/Lib/compiler/pycodegen.py b/Lib/compiler/pycodegen.py index e7ce1a9..6d5a41c 100644 --- a/Lib/compiler/pycodegen.py +++ b/Lib/compiler/pycodegen.py @@ -7,7 +7,8 @@ from cStringIO import StringIO from compiler import ast, parse, walk, syntax from compiler import pyassem, misc, future, symbols -from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL +from compiler.consts import SC_LOCAL, SC_GLOBAL_IMPLICIT, SC_GLOBAL_EXPLICT, \ + SC_FREE, SC_CELL from compiler.consts import (CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS, CO_NESTED, CO_GENERATOR, CO_FUTURE_DIVISION, CO_FUTURE_ABSIMPORT, CO_FUTURE_WITH_STATEMENT, CO_FUTURE_PRINT_FUNCTION) @@ -282,7 +283,9 @@ class CodeGenerator: self.emit(prefix + '_NAME', name) else: self.emit(prefix + '_FAST', name) - elif scope == SC_GLOBAL: + elif scope == SC_GLOBAL_EXPLICT: + self.emit(prefix + '_GLOBAL', name) + elif scope == SC_GLOBAL_IMPLICIT: if not self.optimized: self.emit(prefix + '_NAME', name) else: diff --git a/Lib/compiler/symbols.py b/Lib/compiler/symbols.py index 0e660ae..0bbdc71 100644 --- a/Lib/compiler/symbols.py +++ b/Lib/compiler/symbols.py @@ -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 @@ class Scope: 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 @@ class Scope: 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 @@ class Scope: 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 |