[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