From 92c3b2190bae6dd7844c83b6acefc0b89d2bc225 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Sat, 7 Feb 2009 00:54:41 +0000 Subject: 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. --- Lib/compiler/consts.py | 9 +++++---- Lib/compiler/pycodegen.py | 7 +++++-- Lib/compiler/symbols.py | 9 +++++---- Misc/NEWS | 3 +++ 4 files changed, 18 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 diff --git a/Misc/NEWS b/Misc/NEWS index 96256f5..8d33ee8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -410,6 +410,9 @@ Library protocol numbers are supplied outside the allowed 0-65536 range on bind() and getservbyport(). +- Issue #999042: The Python compiler now handles explict global statements + correctly (should be assigned using STORE_GLOBAL opcode). + Tools/Demos ----------- -- cgit v0.12