[pypy-svn] r75879 - in pypy/trunk/pypy: jit/backend/llsupport jit/backend/llsupport/test rpython/memory

fijal at codespeak.net fijal at codespeak.net
Tue Jul 6 08:19:41 CEST 2010


Author: fijal
Date: Tue Jul  6 08:19:39 2010
New Revision: 75879

Modified:
   pypy/trunk/pypy/jit/backend/llsupport/symbolic.py
   pypy/trunk/pypy/jit/backend/llsupport/test/test_symbolic.py
   pypy/trunk/pypy/rpython/memory/lltypelayout.py
Log:
Support also nolength arrays


Modified: pypy/trunk/pypy/jit/backend/llsupport/symbolic.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/llsupport/symbolic.py	(original)
+++ pypy/trunk/pypy/jit/backend/llsupport/symbolic.py	Tue Jul  6 08:19:39 2010
@@ -36,8 +36,11 @@
             ofs_length = (llmemory.offsetof(T, T._arrayfld) +
                           llmemory.ArrayLengthOffset(SUBARRAY))
         else:
+            if T._hints.get('nolength', None):
+                ofs_length = -1
+            else:
+                ofs_length = llmemory.ArrayLengthOffset(T)
             itemsize = llmemory.sizeof(T.OF)
-            ofs_length = llmemory.ArrayLengthOffset(T)
     else:
         if isinstance(T, lltype.Struct):
             assert T._arrayfld is not None, "%r is not variable-sized" % (T,)
@@ -48,8 +51,11 @@
         else:
             before_array_part = 0
         carray = ll2ctypes.get_ctypes_type(T)
-        assert carray.length.size == WORD
-        ofs_length = before_array_part + carray.length.offset
+        if T._hints.get('nolength', None):
+            ofs_length = -1
+        else:
+            assert carray.length.size == WORD
+            ofs_length = before_array_part + carray.length.offset
         basesize = before_array_part + carray.items.offset
         carrayitem = ll2ctypes.get_ctypes_type(T.OF)
         itemsize = ctypes.sizeof(carrayitem)

Modified: pypy/trunk/pypy/jit/backend/llsupport/test/test_symbolic.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/llsupport/test/test_symbolic.py	(original)
+++ pypy/trunk/pypy/jit/backend/llsupport/test/test_symbolic.py	Tue Jul  6 08:19:39 2010
@@ -61,6 +61,12 @@
         assert basesize >= WORD # at least the 'length', maybe some gc headers
         assert itemsize == WORD
         assert ofs_length == basesize - WORD
+        A = rffi.CArray(lltype.Signed)
+        arraytok = get_array_token(A, translate_support_code)
+        basesize, itemsize, ofs_length = convert(arraytok)
+        assert basesize == 0
+        assert itemsize == WORD
+        assert ofs_length == -1
 
 def test_varsized_struct_size():    
     S1 = lltype.GcStruct('S1', ('parent', S),

Modified: pypy/trunk/pypy/rpython/memory/lltypelayout.py
==============================================================================
--- pypy/trunk/pypy/rpython/memory/lltypelayout.py	(original)
+++ pypy/trunk/pypy/rpython/memory/lltypelayout.py	Tue Jul  6 08:19:39 2010
@@ -111,6 +111,8 @@
     elif isinstance(offset, llmemory.ItemOffset):
         return sizeof(offset.TYPE) * offset.repeat
     elif isinstance(offset, llmemory.ArrayItemsOffset):
+        if offset.TYPE._hints.get('nolength', None):
+            return 0
         return get_fixed_size(lltype.Signed)
     elif isinstance(offset, llmemory.GCHeaderOffset):
         return sizeof(offset.gcheaderbuilder.HDR)



More information about the Pypy-commit mailing list