[pypy-svn] r65807 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Wed Jun 17 18:43:33 CEST 2009


Author: arigo
Date: Wed Jun 17 18:43:30 2009
New Revision: 65807

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py
Log:
Fix for test_div_overflow.  The remaining cases seem to be
inefficiencies but not actual bugs.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	Wed Jun 17 18:43:30 2009
@@ -392,7 +392,7 @@
     def opimpl_check_neg_index(self, pc, arraybox, arraydesc, indexbox):
         negbox = self.metainterp.execute_and_record(
             rop.INT_LT, [indexbox, ConstInt(0)])
-        # XXXXXXXXXXXXXXXXXXXXX fix me
+        # xxx inefficient
         negbox = self.implement_guard_value(pc, negbox)
         if negbox.getint():
             # the index is < 0; add the array length to it
@@ -406,14 +406,14 @@
     def opimpl_check_zerodivisionerror(self, pc, box):
         nonzerobox = self.metainterp.execute_and_record(
             rop.INT_NE, [box, ConstInt(0)])
-        # XXXXXXXXXXXXXXXXXXXXX fix me
+        # xxx inefficient
         nonzerobox = self.implement_guard_value(pc, nonzerobox)
         if nonzerobox.getint():
             return False
         else:
             # division by zero!
             self.metainterp.cpu.set_zero_division_error()
-            return self.metainterp.handle_exception()
+            return self.metainterp.raise_this_error()
 
     @arguments("orgpc", "box", "box")
     def opimpl_check_div_overflow(self, pc, box1, box2):
@@ -425,34 +425,25 @@
             rop.INT_AND, [tmp1, box2])                    # tmp2=-1
         tmp3 = self.metainterp.execute_and_record(
             rop.INT_EQ, [tmp2, ConstInt(-1)])             # tmp3?
-        # XXXXXXXXXXXXXXXXXXXXX fix me
+        # xxx inefficient
         tmp4 = self.implement_guard_value(pc, tmp3)       # tmp4?
         if not tmp4.getint():
             return False
         else:
             # division overflow!
             self.metainterp.cpu.set_overflow_error()
-            return self.metainterp.handle_exception()
+            return self.metainterp.raise_this_error()
 
     @arguments()
     def opimpl_overflow_error(self):
-        # xxx indirect
-        cpu = self.metainterp.cpu
-        cpu.set_overflow_error()
-        etype = cpu.get_exception()
-        evalue = cpu.get_exc_value()
-        cpu.clear_exception()
-        #
-        ts = self.metainterp.staticdata.ts
-        return self.metainterp.finishframe_exception(
-            ts.get_exception_box(etype),
-            ts.get_exc_value_box(evalue))
+        self.metainterp.cpu.set_overflow_error()
+        return self.metainterp.raise_this_error()
 
     @arguments("orgpc", "box")
     def opimpl_int_abs(self, pc, box):
         nonneg = self.metainterp.execute_and_record(
             rop.INT_GE, [box, ConstInt(0)])
-        # XXXXXXXXXXXXXXXXXXXXX fix me
+        # xxx inefficient
         nonneg = self.implement_guard_value(pc, nonneg)
         if nonneg.getint():
             self.make_result_box(box)
@@ -1044,6 +1035,14 @@
         else:
             raise self.staticdata.ExitFrameWithExceptionPtr(excvaluebox.getptr_base())
 
+    def raise_this_error(self):
+        etype = self.cpu.get_exception()
+        evalue = self.cpu.get_exc_value()
+        self.cpu.clear_exception()
+        return self.finishframe_exception(
+            self.staticdata.ts.get_exception_box(etype),
+            self.staticdata.ts.get_exc_value_box(evalue))
+
     def create_empty_history(self):
         self.history = history.History(self.cpu)
         if self.staticdata.stats is not None:

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py	Wed Jun 17 18:43:30 2009
@@ -419,12 +419,17 @@
         assert res == 0
 
     def test_abs(self):
-        def f(x):
-            return abs(x)
-        res = self.interp_operations(f, [-17])
-        assert res == 17
-        res = self.interp_operations(f, [4141])
-        assert res == 4141
+        myjitdriver = JitDriver(greens = [], reds = ['i', 't'])
+        def f(i):
+            t = 0
+            while i < 10:
+                myjitdriver.can_enter_jit(i=i, t=t)
+                myjitdriver.jit_merge_point(i=i, t=t)
+                t += abs(i)
+                i += 1
+            return t
+        res = self.meta_interp(f, [-5])
+        assert res == 5+4+3+2+1+0+1+2+3+4+5+6+7+8+9
 
     def test_print(self):
         myjitdriver = JitDriver(greens = [], reds = ['n'])
@@ -597,7 +602,6 @@
         assert res == -667
 
     def test_div_overflow(self):
-        py.test.skip("fails")
         import sys
         from pypy.rpython.lltypesystem.lloperation import llop
         myjitdriver = JitDriver(greens = [], reds = ['x', 'y', 'res'])



More information about the Pypy-commit mailing list