[pypy-svn] r67360 - in pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport: . test
arigo at codespeak.net
arigo at codespeak.net
Mon Aug 31 15:17:20 CEST 2009
Author: arigo
Date: Mon Aug 31 15:17:20 2009
New Revision: 67360
Modified:
pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/descr.py
pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_descr.py
Log:
Fix calldescrs. get_call_descr() failed if we_are_translated.
Modified: pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/descr.py (original)
+++ pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/descr.py Mon Aug 31 15:17:20 2009
@@ -82,7 +82,7 @@
def getFieldDescrClass(TYPE):
return getDescrClass(TYPE, BaseFieldDescr, GcPtrFieldDescr,
- NonGcPtrFieldDescr, 'Field')
+ NonGcPtrFieldDescr, 'Field', 'get_field_size')
def get_field_descr(gccache, STRUCT, fieldname):
cache = gccache._cache_field
@@ -137,7 +137,7 @@
def getArrayDescrClass(ARRAY):
return getDescrClass(ARRAY.OF, BaseArrayDescr, GcPtrArrayDescr,
- NonGcPtrArrayDescr, 'Array')
+ NonGcPtrArrayDescr, 'Array', 'get_item_size')
def get_array_descr(gccache, ARRAY):
cache = gccache._cache_array
@@ -160,6 +160,7 @@
# CallDescrs
class BaseCallDescr(AbstractDescr):
+ _clsname = ''
call_loop = None
arg_classes = [] # <-- annotation hack
@@ -197,22 +198,30 @@
self.call_loop = loop
return loop
+ def repr_of_descr(self):
+ return '<%s>' % self._clsname
-class GcPtrCallDescr(BaseCallDescr):
- def returns_a_pointer(self):
- return True
+class NonGcPtrCallDescr(BaseCallDescr):
+ _clsname = 'NonGcPtrCallDescr'
def get_result_size(self, translate_support_code):
return symbolic.get_size_of_ptr(translate_support_code)
-class IntCallDescr(BaseCallDescr):
- def __init__(self, arg_classes, result_size):
- BaseCallDescr.__init__(self, arg_classes)
- self.result_size = result_size
+class GcPtrCallDescr(NonGcPtrCallDescr):
+ _clsname = 'GcPtrCallDescr'
+ def returns_a_pointer(self):
+ return True
+class VoidCallDescr(NonGcPtrCallDescr):
+ _clsname = 'VoidCallDescr'
def get_result_size(self, translate_support_code):
- return self.result_size
+ return 0
+def getCallDescrClass(RESULT):
+ if RESULT is lltype.Void:
+ return VoidCallDescr
+ return getDescrClass(RESULT, BaseCallDescr, GcPtrCallDescr,
+ NonGcPtrCallDescr, 'Call', 'get_result_size')
def get_call_descr(gccache, ARGS, RESULT):
arg_classes = []
@@ -222,20 +231,13 @@
elif kind == 'ptr': arg_classes.append(BoxPtr)
else:
raise NotImplementedError('ARG = %r' % (ARG,))
- if RESULT is lltype.Void:
- result_size = 0
- else:
- result_size = symbolic.get_size(RESULT, gccache.translate_support_code)
- ptr = isinstance(RESULT, lltype.Ptr) and RESULT.TO._gckind == 'gc'
- key = (tuple(arg_classes), result_size, ptr)
+ cls = getCallDescrClass(RESULT)
+ key = (cls, tuple(arg_classes))
cache = gccache._cache_call
try:
return cache[key]
except KeyError:
- if ptr:
- calldescr = GcPtrCallDescr(arg_classes)
- else:
- calldescr = IntCallDescr(arg_classes, result_size)
+ calldescr = cls(arg_classes)
cache[key] = calldescr
return calldescr
@@ -243,7 +245,7 @@
# ____________________________________________________________
def getDescrClass(TYPE, BaseDescr, GcPtrDescr, NonGcPtrDescr,
- nameprefix, _cache={}):
+ nameprefix, methodname, _cache={}):
if isinstance(TYPE, lltype.Ptr):
if TYPE.TO._gckind == 'gc':
return GcPtrDescr
@@ -255,10 +257,11 @@
#
class Descr(BaseDescr):
_clsname = '%s%sDescr' % (TYPE._name, nameprefix)
- def get_field_size(self, translate_support_code):
- return symbolic.get_size(TYPE, translate_support_code)
- get_item_size = get_field_size
- #
Descr.__name__ = Descr._clsname
+ #
+ def method(self, translate_support_code):
+ return symbolic.get_size(TYPE, translate_support_code)
+ setattr(Descr, methodname, method)
+ #
_cache[nameprefix, TYPE] = Descr
return Descr
Modified: pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_descr.py
==============================================================================
--- pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_descr.py (original)
+++ pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/test/test_descr.py Mon Aug 31 15:17:20 2009
@@ -124,6 +124,12 @@
#
U = lltype.GcStruct('U', ('x', lltype.Signed))
assert descr2 == get_call_descr(c0, [lltype.Ptr(U)], lltype.Ptr(U))
+ #
+ c1 = GcCache(True)
+ descr3 = get_call_descr(c1, [lltype.Ptr(T)], lltype.Ptr(U))
+ assert isinstance(descr3.get_result_size(True), Symbolic)
+ assert descr3.returns_a_pointer()
+ assert descr3.arg_classes == [BoxPtr]
def test_repr_of_descr():
@@ -155,4 +161,4 @@
assert 'GcPtrCallDescr' in descr4.repr_of_descr()
#
descr4i = get_call_descr(c0, [lltype.Char, lltype.Ptr(S)], lltype.Char)
- assert 'IntCallDescr' in descr4i.repr_of_descr()
+ assert 'CharCallDescr' in descr4i.repr_of_descr()
More information about the Pypy-commit
mailing list