[pypy-svn] r72873 - in pypy/branch/kill-asm-call/pypy/jit/backend/llsupport: . test

fijal at codespeak.net fijal at codespeak.net
Fri Mar 26 03:48:07 CET 2010


Author: fijal
Date: Fri Mar 26 03:48:06 2010
New Revision: 72873

Modified:
   pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/descr.py
   pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/llmodel.py
   pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/test/test_descr.py
Log:
Return a correct empty box. I think this is the cause of crashes (not sure)


Modified: pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/descr.py	(original)
+++ pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/descr.py	Fri Mar 26 03:48:06 2010
@@ -179,6 +179,7 @@
 # CallDescrs
 
 class BaseCallDescr(AbstractDescr):
+    empty_box = BoxInt(0)
     _clsname = ''
     loop_token = None
     arg_classes = ''     # <-- annotation hack
@@ -190,15 +191,6 @@
     def get_extra_info(self):
         return self.extrainfo
 
-    def instantiate_arg_classes(self):
-        result = []
-        for c in self.arg_classes:
-            if   c == 'i': box = BoxInt()
-            elif c == 'f': box = BoxFloat()
-            else:          box = BoxPtr()
-            result.append(box)
-        return result
-
     _returns_a_pointer = False        # unless overridden by GcPtrCallDescr
     _returns_a_float   = False        # unless overridden by FloatCallDescr
     _returns_a_void    = False        # unless overridden by VoidCallDescr
@@ -269,18 +261,17 @@
 
 class NonGcPtrCallDescr(BaseCallDescr):
     _clsname = 'NonGcPtrCallDescr'
-    _tp = 'i' # XXX
     
     def get_result_size(self, translate_support_code):
         return symbolic.get_size_of_ptr(translate_support_code)
 
 class GcPtrCallDescr(NonGcPtrCallDescr):
-    _tp = 'r'
+    empty_box = BoxPtr(lltype.nullptr(llmemory.GCREF.TO))
     _clsname = 'GcPtrCallDescr'
     _returns_a_pointer = True
 
 class VoidCallDescr(NonGcPtrCallDescr):
-    _tp = 'v'
+    empty_box = None
     _clsname = 'VoidCallDescr'
     _returns_a_void = True
     
@@ -339,6 +330,7 @@
         #
         if TYPE is lltype.Float:
             setattr(Descr, floatattrname, True)
+            Descr.empty_box = BoxFloat(0.0)
         #
         _cache[nameprefix, TYPE] = Descr
         return Descr

Modified: pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/llmodel.py	Fri Mar 26 03:48:06 2010
@@ -492,11 +492,7 @@
                 self.saved_exc_value = lltype.cast_opaque_ptr(llmemory.GCREF,
                                                               ptr)
                 self.saved_exception = rffi.cast(lltype.Signed, ptr.typeptr)
-            if calldescr.returns_a_void():
-                return None
-            # we need a box to put in env. This is harmless since nobody
-            # should depend on it's value or type
-            return empty_int_box
+            return calldescr.empty_box
             
     def do_cast_ptr_to_int(self, ptrbox):
         return BoxInt(self.cast_gcref_to_int(ptrbox.getref_base()))

Modified: pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/test/test_descr.py
==============================================================================
--- pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/test/test_descr.py	(original)
+++ pypy/branch/kill-asm-call/pypy/jit/backend/llsupport/test/test_descr.py	Fri Mar 26 03:48:06 2010
@@ -3,7 +3,7 @@
 from pypy.jit.backend.llsupport import symbolic
 from pypy.rlib.objectmodel import Symbolic
 from pypy.rpython.annlowlevel import llhelper
-from pypy.jit.metainterp.history import BoxInt
+from pypy.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr
 
 def test_get_size_descr():
     c0 = GcCache(False)
@@ -148,6 +148,7 @@
     assert not descr1.returns_a_pointer()
     assert not descr1.returns_a_float()
     assert descr1.arg_classes == "ii"
+    assert isinstance(descr1.empty_box, BoxInt)
     #
     T = lltype.GcStruct('T')
     descr2 = get_call_descr(c0, [lltype.Ptr(T)], lltype.Ptr(T))
@@ -155,15 +156,22 @@
     assert descr2.returns_a_pointer()
     assert not descr2.returns_a_float()
     assert descr2.arg_classes == "r"
+    assert isinstance(descr2.empty_box, BoxPtr)
     #
     U = lltype.GcStruct('U', ('x', lltype.Signed))
     assert descr2 == get_call_descr(c0, [lltype.Ptr(U)], lltype.Ptr(U))
     #
+    V = lltype.Struct('V', ('x', lltype.Signed))
+    assert isinstance(get_call_descr(c0, [], lltype.Ptr(V)).empty_box, BoxInt)
+    #
+    assert get_call_descr(c0, [], lltype.Void).empty_box is None
+    #
     descr4 = get_call_descr(c0, [lltype.Float, lltype.Float], lltype.Float)
     assert descr4.get_result_size(False) == rffi.sizeof(lltype.Float)
     assert not descr4.returns_a_pointer()
     assert descr4.returns_a_float()
     assert descr4.arg_classes == "ff"
+    assert isinstance(descr4.empty_box, BoxFloat)
 
 def test_get_call_descr_translated():
     c1 = GcCache(True)



More information about the Pypy-commit mailing list