[pypy-svn] r44101 - in pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Thu Jun 7 19:04:09 CEST 2007


Author: cfbolz
Date: Thu Jun  7 19:04:08 2007
New Revision: 44101

Modified:
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/compiler.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/interpreter.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_compiler.py
Log:
fix some problems with the local variable activation concept


Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/compiler.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/compiler.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/compiler.py	Thu Jun  7 19:04:08 2007
@@ -47,10 +47,12 @@
         self.varmap = {}
         self.can_contain_cut = False
         result = Code()
+        self.activate_vars_later = True
         self.compile_termbuilding(head)
         result.opcode_head = self.getbytecode()
         if body is not None:
             self.add_localactivations()
+            self.activate_vars_later = False
             self.compile_body(body)
         result.opcode = self.getbytecode()
         result.constants = self.constants
@@ -100,12 +102,10 @@
             i = builtins_index[body.signature]
             self.compile_termbuilding(body)
             self.emit_opcode(opcodedesc.CALL_BUILTIN, i)
-            self.add_localactivations()
         else:
             self.compile_termbuilding(body)
             num = self.getfunction(body.signature)
             self.emit_opcode(opcodedesc.STATIC_CALL, num)
-            self.add_localactivations()
 
     def compile_localvar(self, var):
         try:
@@ -113,7 +113,8 @@
         except KeyError:
             num = self.varmap[var] = len(self.varmap)
             self.emit_opcode(opcodedesc.MAKELOCALVAR, num)
-            self.emit_opcode(opcodedesc.ACTIVATE_LOCAL, num, True)
+            self.emit_opcode(opcodedesc.ACTIVATE_LOCAL, num,
+                             self.activate_vars_later)
             return
         self.emit_opcode(opcodedesc.PUTLOCALVAR, num)
 

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/interpreter.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/interpreter.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/interpreter.py	Thu Jun  7 19:04:08 2007
@@ -134,7 +134,7 @@
         stack.append(self.code.constants[number])
 
     def MAKELOCALVAR(self, stack, number):
-        result = self.localvarcache[number] = self.engine.heap.newvar()
+        result = self.localvarcache[number] = LocalVar()
         stack.append(result)
 
     def PUTLOCALVAR(self, stack, number):
@@ -145,7 +145,7 @@
     def ACTIVATE_LOCAL(self, stack, number):
         var = self.localvarcache[number]
         if isinstance(var, LocalVar):
-            self.localvarcache[number] = var.dereference(self.heap)
+            self.localvarcache[number] = var.dereference(self.engine.heap)
             var.active = True
 
     def MAKETERM(self, stack, number):

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_compiler.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_compiler.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_compiler.py	Thu Jun  7 19:04:08 2007
@@ -85,8 +85,7 @@
     code = compile(head, body, e)
     assert code.opcode_head == "m\x00\x00t\x00\x00"
     assert code.opcode.startswith(
-        "a\x00\x00m\x00\x01l\x00\x00c\x00\x00t\x00\x01t\x00\x02b\x00\x02"
-        "a\x00\x01")
+        "a\x00\x00m\x00\x01a\x00\x01l\x00\x00c\x00\x00t\x00\x01t\x00\x02b")
     assert code.constants == [Number(1)]
     assert code.term_info == [("f", 1, "f/1"), ("-", 2, "-/2"),
                               ("is", 2, "is/2")]



More information about the Pypy-commit mailing list