[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