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

cfbolz at codespeak.net cfbolz at codespeak.net
Thu Jun 7 11:14:30 CEST 2007


Author: cfbolz
Date: Thu Jun  7 11:14:29 2007
New Revision: 44075

Modified:
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/interpreter.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_interpreter.py
Log:
eh, nasty bug: the orders of the term arguments were reversed


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 11:14:29 2007
@@ -125,10 +125,10 @@
     def MAKETERM(self, stack, number, *ignored):
         name, numargs, signature = self.code.term_info[number]
         args = [None] * numargs
-        i = 0
-        while i < numargs:
+        i = numargs - 1
+        while i >= 0:
             args[i] = stack.pop()
-            i += 1
+            i -= 1
         stack.append(Term(name, args, signature))
 
     def CALL_BUILTIN(self, stack, number, continuation, *ignored):
@@ -155,6 +155,7 @@
                 self.engine.heap.revert(oldstate)
             rule = rulechain.rule
             rulechain = rulechain.next
+        raise error.UnificationFailed
 
     def CLEAR_LOCAL(self, stack, number, *ignored):
         self.localvarcache[number] = None

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_interpreter.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_interpreter.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/test/test_interpreter.py	Thu Jun  7 11:14:29 2007
@@ -1,5 +1,5 @@
 import py
-from pypy.lang.prolog.interpreter.interpreter import Rule
+from pypy.lang.prolog.interpreter.interpreter import Rule, Frame
 from pypy.lang.prolog.interpreter.parsing import get_engine, get_query_and_vars
 
 def test_simple():
@@ -20,4 +20,13 @@
     assert cont is c2
     assert vars['X'].dereference(e.heap).name == 'a'
 
+def test_build_term():
+    e = get_engine("")
+    head, body = get_query_and_vars("f(X, Y) :- X = a, Y = b.")[0].args
+    r = Rule(head, body, e)
 
+    frame = Frame(e, r.code)
+    frame.run(frame.code.opcode_head, 0, None)
+    frame.run(frame.code.opcode, 0, None)
+    assert frame.stack[0].args[0].dereference(e.heap).name == "a"
+    assert frame.stack[0].args[1].dereference(e.heap).name == "b"


More information about the pypy-svn mailing list