[pypy-svn] r58377 - pypy/branch/2.5-features/pypy/interpreter/astcompiler
fijal at codespeak.net
fijal at codespeak.net
Tue Sep 23 13:59:02 CEST 2008
Author: fijal
Date: Tue Sep 23 13:59:00 2008
New Revision: 58377
Modified:
pypy/branch/2.5-features/pypy/interpreter/astcompiler/pyassem.py
pypy/branch/2.5-features/pypy/interpreter/astcompiler/pycodegen.py
Log:
Port a couple of fixes from dist. This is necessary to run any tests.
Modified: pypy/branch/2.5-features/pypy/interpreter/astcompiler/pyassem.py
==============================================================================
--- pypy/branch/2.5-features/pypy/interpreter/astcompiler/pyassem.py (original)
+++ pypy/branch/2.5-features/pypy/interpreter/astcompiler/pyassem.py Tue Sep 23 13:59:00 2008
@@ -51,7 +51,8 @@
self.argcount = self.argcount - 1
def checkFlag(self, flag):
- return self.flags & flag
+ if self.flags & flag:
+ return 1
def setFreeVars(self, names):
self.freevars = list(names)
@@ -257,6 +258,8 @@
depths[i] = stackdepth
else:
if previous_value != stackdepth:
+ import pdb
+ pdb.set_trace()
raise InternalCompilerError("inconsistent stack depth")
def computeStackDepth(self):
@@ -264,6 +267,7 @@
co_code = self.co_code
self._stackdepths = [UNREACHABLE] * len(co_code)
self._stackdepths[0] = 0
+ just_loaded_const = None
consts_w = self.getConsts()
finally_targets = {}
largestsize = 0
@@ -291,6 +295,7 @@
i += 1
if curstackdepth == UNREACHABLE:
+ just_loaded_const = None
continue # ignore unreachable instructions
if opcode in DEPTH_OP_EFFECT_ALONG_JUMP:
@@ -308,12 +313,28 @@
except KeyError:
pass
else:
- effect = tracker(oparg)
+ if opcode == pythonopcode.opmap['MAKE_CLOSURE']:
+ # only supports "LOAD_CONST co / MAKE_CLOSURE n"
+ if just_loaded_const is None:
+ raise InternalCompilerError("MAKE_CLOSURE not "
+ "following LOAD_CONST")
+ codeobj = self.space.interp_w(PyCode, just_loaded_const)
+ nfreevars = len(codeobj.co_freevars)
+ effect = - nfreevars - oparg
+ else:
+ effect = tracker(oparg)
+
curstackdepth += effect
if i in finally_targets:
curstackdepth += 2 # see pyopcode.FinallyBlock.cleanup()
self._setdepth(i, curstackdepth)
+ if opcode == pythonopcode.opmap['LOAD_CONST']:
+ just_loaded_const = consts_w[oparg]
+ else:
+ just_loaded_const = None
+
+
self.stacksize = largestsize
def fixLabelTargets(self):
@@ -464,9 +485,8 @@
def depth_MAKE_FUNCTION(argc):
return -argc
def depth_MAKE_CLOSURE(argc):
- if argc == 0:
- return -1
- return -argc
+ raise InternalCompilerError("must special-case this in order to account"
+ " for the free variables")
def depth_BUILD_SLICE(argc):
if argc == 2:
return -1
Modified: pypy/branch/2.5-features/pypy/interpreter/astcompiler/pycodegen.py
==============================================================================
--- pypy/branch/2.5-features/pypy/interpreter/astcompiler/pycodegen.py (original)
+++ pypy/branch/2.5-features/pypy/interpreter/astcompiler/pycodegen.py Tue Sep 23 13:59:00 2008
@@ -335,21 +335,18 @@
self.set_lineno(node)
for default in node.defaults:
default.accept( self )
- self._makeClosure(gen, len(node.defaults))
- for i in range(ndecorators):
- self.emitop_int('CALL_FUNCTION', 1)
-
- def _makeClosure(self, gen, args):
frees = gen.scope.get_free_vars_in_parent()
if frees:
for name in frees:
self.emitop('LOAD_CLOSURE', name)
- self.emitop_int('BUILD_TUPLE', len(frees))
self.emitop_code('LOAD_CONST', gen)
- self.emitop_int('MAKE_CLOSURE', args)
+ self.emitop_int('MAKE_CLOSURE', len(node.defaults))
else:
self.emitop_code('LOAD_CONST', gen)
- self.emitop_int('MAKE_FUNCTION', args)
+ self.emitop_int('MAKE_FUNCTION', len(node.defaults))
+ for i in range(ndecorators):
+ self.emitop_int('CALL_FUNCTION', 1)
+
def visitClass(self, node):
gen = ClassCodeGenerator(self.space, node,
@@ -361,7 +358,16 @@
for base in node.bases:
base.accept( self )
self.emitop_int('BUILD_TUPLE', len(node.bases))
- self._makeClosure(gen, 0)
+ frees = gen.scope.get_free_vars_in_parent()
+ if frees:
+ for name in frees:
+ self.emitop('LOAD_CLOSURE', name)
+ self.emitop_code('LOAD_CONST', gen)
+ self.emitop_int('MAKE_CLOSURE', 0)
+ else:
+ self.emitop_code('LOAD_CONST', gen)
+ self.emitop_int('MAKE_FUNCTION', 0)
+
self.emitop_int('CALL_FUNCTION', 0)
self.emit('BUILD_CLASS')
self.storeName(node.name, node.lineno)
@@ -593,7 +599,7 @@
def visitListComp(self, node):
self.set_lineno(node)
# setup list
- tmpname = "$list%d" % self.__list_count
+ tmpname = "_[%d]" % self.__list_count
self.__list_count = self.__list_count + 1
self.emitop_int('BUILD_LIST', 0)
self.emit('DUP_TOP')
@@ -655,7 +661,16 @@
inner.accept( gen )
gen.finish()
self.set_lineno(node)
- self._makeClosure(gen, 0)
+ frees = gen.scope.get_free_vars_in_parent()
+ if frees:
+ for name in frees:
+ self.emitop('LOAD_CLOSURE', name)
+ self.emitop_code('LOAD_CONST', gen)
+ self.emitop_int('MAKE_CLOSURE', 0)
+ else:
+ self.emitop_code('LOAD_CONST', gen)
+ self.emitop_int('MAKE_FUNCTION', 0)
+
# precomputation of outmost iterable
qual0 = inner.quals[0]
assert isinstance(qual0, ast.GenExprFor)
More information about the Pypy-commit
mailing list