[pypy-svn] r75880 - in pypy/trunk/pypy/jit/backend/llsupport: . test
fijal at codespeak.net
fijal at codespeak.net
Tue Jul 6 08:46:17 CEST 2010
Author: fijal
Date: Tue Jul 6 08:46:16 2010
New Revision: 75880
Modified:
pypy/trunk/pypy/jit/backend/llsupport/descr.py
pypy/trunk/pypy/jit/backend/llsupport/test/test_descr.py
Log:
Support descrs of nolength arrays
Modified: pypy/trunk/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/llsupport/descr.py (original)
+++ pypy/trunk/pypy/jit/backend/llsupport/descr.py Tue Jul 6 08:46:16 2010
@@ -151,7 +151,6 @@
def repr_of_descr(self):
return '<%s>' % self._clsname
-
class NonGcPtrArrayDescr(BaseArrayDescr):
_clsname = 'NonGcPtrArrayDescr'
def get_item_size(self, translate_support_code):
@@ -161,17 +160,45 @@
_clsname = 'GcPtrArrayDescr'
_is_array_of_pointers = True
+_CA = rffi.CArray(lltype.Signed)
+
+class BaseArrayNoLengthDescr(BaseArrayDescr):
+ def get_base_size(self, translate_support_code):
+ basesize, _, _ = symbolic.get_array_token(_CA, translate_support_code)
+ return basesize
+
+ def get_ofs_length(self, translate_support_code):
+ _, _, ofslength = symbolic.get_array_token(_CA, translate_support_code)
+ return ofslength
+
+class NonGcPtrArrayNoLengthDescr(BaseArrayNoLengthDescr):
+ _clsname = 'NonGcPtrArrayNoLengthDescr'
+ def get_item_size(self, translate_support_code):
+ return symbolic.get_size_of_ptr(translate_support_code)
+
+class GcPtrArrayNoLengthDescr(NonGcPtrArrayNoLengthDescr):
+ _clsname = 'GcPtrArrayNoLengthDescr'
+ _is_array_of_pointers = True
+
def getArrayDescrClass(ARRAY):
return getDescrClass(ARRAY.OF, BaseArrayDescr, GcPtrArrayDescr,
NonGcPtrArrayDescr, 'Array', 'get_item_size',
'_is_array_of_floats')
+def getArrayNoLengthDescrClass(ARRAY):
+ return getDescrClass(ARRAY.OF, BaseArrayNoLengthDescr, GcPtrArrayNoLengthDescr,
+ NonGcPtrArrayNoLengthDescr, 'ArrayNoLength', 'get_item_size',
+ '_is_array_of_floats')
+
def get_array_descr(gccache, ARRAY):
cache = gccache._cache_array
try:
return cache[ARRAY]
except KeyError:
- arraydescr = getArrayDescrClass(ARRAY)()
+ if ARRAY._hints.get('nolength', False):
+ arraydescr = getArrayNoLengthDescrClass(ARRAY)()
+ else:
+ arraydescr = getArrayDescrClass(ARRAY)()
# verify basic assumption that all arrays' basesize and ofslength
# are equal
basesize, itemsize, ofslength = symbolic.get_array_token(ARRAY, False)
Modified: pypy/trunk/pypy/jit/backend/llsupport/test/test_descr.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/llsupport/test/test_descr.py (original)
+++ pypy/trunk/pypy/jit/backend/llsupport/test/test_descr.py Tue Jul 6 08:46:16 2010
@@ -140,7 +140,25 @@
assert isinstance(descr2.get_item_size(True), Symbolic)
assert isinstance(descr3.get_item_size(True), Symbolic)
assert isinstance(descr4.get_item_size(True), Symbolic)
-
+ CA = rffi.CArray(lltype.Signed)
+ descr = get_array_descr(c0, CA)
+ assert not descr.is_array_of_floats()
+ assert descr.get_base_size(False) == 0
+ assert descr.get_ofs_length(False) == -1
+ CA = rffi.CArray(lltype.Ptr(lltype.GcStruct('S')))
+ descr = get_array_descr(c0, CA)
+ assert descr.is_array_of_pointers()
+ assert descr.get_base_size(False) == 0
+ assert descr.get_ofs_length(False) == -1
+ CA = rffi.CArray(lltype.Ptr(lltype.Struct('S')))
+ descr = get_array_descr(c0, CA)
+ assert descr.get_base_size(False) == 0
+ assert descr.get_ofs_length(False) == -1
+ CA = rffi.CArray(lltype.Float)
+ descr = get_array_descr(c0, CA)
+ assert descr.is_array_of_floats()
+ assert descr.get_base_size(False) == 0
+ assert descr.get_ofs_length(False) == -1
def test_get_call_descr_not_translated():
c0 = GcCache(False)
More information about the Pypy-commit
mailing list