[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