[pypy-svn] r74957 - in pypy/branch/blackhole-improvement/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Mon May 31 02:15:20 CEST 2010


Author: arigo
Date: Mon May 31 02:15:19 2010
New Revision: 74957

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_executor.py
Log:
Some more fixes for when last_exc_value_box is expected
to be cleared or not.  Now clear it a bit more aggressively
before running any operation that might set it --- this
includes CALL_PURE, even though it cannot actually set it;
previously, it would fail to clear the exception in that
case, and crash because one exception is still set.


Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	Mon May 31 02:15:19 2010
@@ -58,8 +58,6 @@
         except Exception, e:
             metainterp.execute_raised(e)
             result = 0
-        else:
-            metainterp.execute_did_not_raise()
         return BoxInt(result)
     if rettype == REF:
         try:
@@ -67,8 +65,6 @@
         except Exception, e:
             metainterp.execute_raised(e)
             result = NULL
-        else:
-            metainterp.execute_did_not_raise()
         return BoxPtr(result)
     if rettype == FLOAT:
         try:
@@ -76,16 +72,12 @@
         except Exception, e:
             metainterp.execute_raised(e)
             result = 0.0
-        else:
-            metainterp.execute_did_not_raise()
         return BoxFloat(result)
     if rettype == VOID:
         try:
             cpu.bh_call_v(func, descr, args_i, args_r, args_f)
         except Exception, e:
             metainterp.execute_raised(e)
-        else:
-            metainterp.execute_did_not_raise()
         return None
     raise AssertionError("bad rettype")
 
@@ -189,8 +181,6 @@
     except OverflowError:
         metainterp.execute_raised(OverflowError(), constant=True)
         z = 0
-    else:
-        metainterp.execute_did_not_raise()
     return BoxInt(z)
 
 def do_int_sub_ovf(cpu, metainterp, box1, box2):
@@ -202,8 +192,6 @@
     except OverflowError:
         metainterp.execute_raised(OverflowError(), constant=True)
         z = 0
-    else:
-        metainterp.execute_did_not_raise()
     return BoxInt(z)
 
 def do_int_mul_ovf(cpu, metainterp, box1, box2):
@@ -215,8 +203,6 @@
     except OverflowError:
         metainterp.execute_raised(OverflowError(), constant=True)
         z = 0
-    else:
-        metainterp.execute_did_not_raise()
     return BoxInt(z)
 
 def do_same_as(cpu, _, box):

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Mon May 31 02:15:19 2010
@@ -184,6 +184,7 @@
         exec py.code.Source('''
             @arguments("box", "box")
             def opimpl_%s(self, b1, b2):
+                self.metainterp.clear_exception()
                 resbox = self.execute(rop.%s, b1, b2)
                 self.make_result_of_lastop(resbox)  # same as execute_varargs()
                 self.metainterp.handle_possible_overflow_error()
@@ -971,6 +972,7 @@
 
     @specialize.arg(1)
     def execute_varargs(self, opnum, argboxes, descr, exc):
+        self.metainterp.clear_exception()
         resbox = self.metainterp.execute_and_record_varargs(opnum, argboxes,
                                                             descr=descr)
         self.make_result_of_lastop(resbox)
@@ -1022,6 +1024,7 @@
                              effectinfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE or
                 assembler_call_token is not None):
             # residual calls require attention to keep virtualizables in-sync
+            self.metainterp.clear_exception()
             self.metainterp.vable_and_vrefs_before_residual_call()
             resbox = self.metainterp.execute_and_record_varargs(
                 rop.CALL_MAY_FORCE, allboxes, descr=descr)
@@ -1451,7 +1454,7 @@
         # stored in the exc_value Box can be assumed to be a Const.  This
         # is only True after a GUARD_EXCEPTION or GUARD_CLASS.
 
-    def execute_did_not_raise(self):
+    def clear_exception(self):
         self.last_exc_value_box = None
 
     def aborted_tracing(self, reason):
@@ -1647,7 +1650,7 @@
                 self.execute_ll_raised(lltype.cast_opaque_ptr(rclass.OBJECTPTR,
                                                               exception))
             else:
-                self.execute_did_not_raise()
+                self.clear_exception()
             try:
                 self.handle_possible_exception()
             except ChangeFrame:
@@ -1659,7 +1662,7 @@
             except ChangeFrame:
                 pass
         elif opnum == rop.GUARD_OVERFLOW:      # no longer overflowing
-            self.execute_did_not_raise()
+            self.clear_exception()
         else:
             from pypy.jit.metainterp.resoperation import opname
             raise NotImplementedError(opname[opnum])

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_executor.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_executor.py	Mon May 31 02:15:19 2010
@@ -38,8 +38,7 @@
         self.fakeargs = args
 
 class FakeMetaInterp:
-    def execute_did_not_raise(self):
-        self.didraise = False
+    pass
 
 class FakeCPU(AbstractCPU):
     supports_floats = True
@@ -76,15 +75,13 @@
 
 def test_execute_varargs():
     cpu = FakeCPU()
-    metainterp = FakeMetaInterp()
     descr = FakeCallDescr()
     argboxes = [BoxInt(99999), BoxInt(321), ConstFloat(2.25), ConstInt(123),
                 BoxPtr(), BoxFloat(5.5)]
-    box = execute_varargs(cpu, metainterp, rop.CALL, argboxes, descr)
+    box = execute_varargs(cpu, FakeMetaInterp(), rop.CALL, argboxes, descr)
     assert box.value == 42.5
     assert cpu.fakecalled == (99999, descr, [321, 123],
                               [ConstPtr.value], [2.25, 5.5])
-    assert not metainterp.didraise
 
 def test_execute_nonspec():
     cpu = FakeCPU()



More information about the Pypy-commit mailing list