Kaydet (Commit) 92c3b219 authored tarafından Neil Schemenauer's avatar Neil Schemenauer

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.
üst 98c3b85b
...@@ -4,10 +4,11 @@ OP_DELETE = 'OP_DELETE' ...@@ -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
......
...@@ -7,7 +7,8 @@ from cStringIO import StringIO ...@@ -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: ...@@ -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:
......
"""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: ...@@ -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: ...@@ -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: ...@@ -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
......
...@@ -410,6 +410,9 @@ Library ...@@ -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
----------- -----------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment