[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