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:
Neil Schemenauer 2009-02-07 00:54:41 +00:00
parent 98c3b85bc4
commit 92c3b2190b
4 changed files with 18 additions and 10 deletions

View File

@ -4,10 +4,11 @@ OP_DELETE = 'OP_DELETE'
OP_APPLY = 'OP_APPLY' OP_APPLY = 'OP_APPLY'
SC_LOCAL = 1 SC_LOCAL = 1
SC_GLOBAL = 2 SC_GLOBAL_IMPLICIT = 2
SC_FREE = 3 SC_GLOBAL_EXPLICT = 3
SC_CELL = 4 SC_FREE = 4
SC_UNKNOWN = 5 SC_CELL = 5
SC_UNKNOWN = 6
CO_OPTIMIZED = 0x0001 CO_OPTIMIZED = 0x0001
CO_NEWLOCALS = 0x0002 CO_NEWLOCALS = 0x0002

View File

@ -7,7 +7,8 @@ from cStringIO import StringIO
from compiler import ast, parse, walk, syntax from compiler import ast, parse, walk, syntax
from compiler import pyassem, misc, future, symbols 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, from compiler.consts import (CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS,
CO_NESTED, CO_GENERATOR, CO_FUTURE_DIVISION, CO_NESTED, CO_GENERATOR, CO_FUTURE_DIVISION,
CO_FUTURE_ABSIMPORT, CO_FUTURE_WITH_STATEMENT, CO_FUTURE_PRINT_FUNCTION) CO_FUTURE_ABSIMPORT, CO_FUTURE_WITH_STATEMENT, CO_FUTURE_PRINT_FUNCTION)
@ -282,7 +283,9 @@ class CodeGenerator:
self.emit(prefix + '_NAME', name) self.emit(prefix + '_NAME', name)
else: else:
self.emit(prefix + '_FAST', name) 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: if not self.optimized:
self.emit(prefix + '_NAME', name) self.emit(prefix + '_NAME', name)
else: else:

View File

@ -1,7 +1,8 @@
"""Module symbol-table generator""" """Module symbol-table generator"""
from compiler import ast 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 from compiler.misc import mangle
import types import types
@ -89,7 +90,7 @@ class Scope:
The scope of a name could be LOCAL, GLOBAL, FREE, or CELL. The scope of a name could be LOCAL, GLOBAL, FREE, or CELL.
""" """
if name in self.globals: if name in self.globals:
return SC_GLOBAL return SC_GLOBAL_EXPLICT
if name in self.cells: if name in self.cells:
return SC_CELL return SC_CELL
if name in self.defs: if name in self.defs:
@ -99,7 +100,7 @@ class Scope:
if self.nested: if self.nested:
return SC_UNKNOWN return SC_UNKNOWN
else: else:
return SC_GLOBAL return SC_GLOBAL_IMPLICIT
def get_free_vars(self): def get_free_vars(self):
if not self.nested: if not self.nested:
@ -152,7 +153,7 @@ class Scope:
if sc == SC_UNKNOWN or sc == SC_FREE \ if sc == SC_UNKNOWN or sc == SC_FREE \
or isinstance(self, ClassScope): or isinstance(self, ClassScope):
self.frees[name] = 1 self.frees[name] = 1
elif sc == SC_GLOBAL: elif sc == SC_GLOBAL_IMPLICIT:
child_globals.append(name) child_globals.append(name)
elif isinstance(self, FunctionScope) and sc == SC_LOCAL: elif isinstance(self, FunctionScope) and sc == SC_LOCAL:
self.cells[name] = 1 self.cells[name] = 1

View File

@ -410,6 +410,9 @@ Library
protocol numbers are supplied outside the allowed 0-65536 range on bind() protocol numbers are supplied outside the allowed 0-65536 range on bind()
and getservbyport(). and getservbyport().
- Issue #999042: The Python compiler now handles explict global statements
correctly (should be assigned using STORE_GLOBAL opcode).
Tools/Demos Tools/Demos
----------- -----------