mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Add support for future statements
This commit is contained in:
parent
42a0830713
commit
80e29bd139
4 changed files with 196 additions and 12 deletions
|
@ -9,7 +9,7 @@ import types
|
|||
from cStringIO import StringIO
|
||||
|
||||
from compiler import ast, parse, walk
|
||||
from compiler import pyassem, misc
|
||||
from compiler import pyassem, misc, future
|
||||
from compiler.pyassem import CO_VARARGS, CO_VARKEYWORDS, CO_NEWLOCALS, TupleArg
|
||||
|
||||
# Do we have Python 1.x or Python 2.x?
|
||||
|
@ -43,13 +43,13 @@ class Module:
|
|||
self.code = None
|
||||
|
||||
def compile(self, display=0):
|
||||
ast = parse(self.source)
|
||||
tree = parse(self.source)
|
||||
root, filename = os.path.split(self.filename)
|
||||
gen = ModuleCodeGenerator(filename)
|
||||
walk(ast, gen, 1)
|
||||
walk(tree, gen, 1)
|
||||
if display:
|
||||
import pprint
|
||||
print pprint.pprint(ast)
|
||||
print pprint.pprint(tree)
|
||||
self.code = gen.getCode()
|
||||
|
||||
def dump(self, f):
|
||||
|
@ -862,12 +862,24 @@ class CodeGenerator:
|
|||
self.emit('STORE_SUBSCR')
|
||||
|
||||
class ModuleCodeGenerator(CodeGenerator):
|
||||
super_init = CodeGenerator.__init__
|
||||
__super_init = CodeGenerator.__init__
|
||||
__super_visitModule = CodeGenerator.visitModule
|
||||
|
||||
def __init__(self, filename):
|
||||
# XXX <module> is ? in compile.c
|
||||
self.graph = pyassem.PyFlowGraph("<module>", filename)
|
||||
self.super_init(filename)
|
||||
self.__super_init(filename)
|
||||
self.symbols = None
|
||||
self.future = None
|
||||
|
||||
def visitModule(self, node):
|
||||
self.future = future.find_futures(node)
|
||||
self.symbols = self.parseSymbols(node)
|
||||
self.__super_visitModule(node)
|
||||
|
||||
def parseSymbols(self, node):
|
||||
# XXX not implemented
|
||||
return None
|
||||
|
||||
class FunctionCodeGenerator(CodeGenerator):
|
||||
super_init = CodeGenerator.__init__
|
||||
|
@ -965,6 +977,8 @@ class LocalNameFinder:
|
|||
for name in names:
|
||||
self.names.add(name)
|
||||
|
||||
# XXX list comprehensions and for loops
|
||||
|
||||
def getLocals(self):
|
||||
for elt in self.globals.elements():
|
||||
if self.names.has_elt(elt):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue