[pypy-svn] r24206 - in pypy/dist/pypy: rpython/memory translator/c/test
mwh at codespeak.net
mwh at codespeak.net
Fri Mar 10 11:34:52 CET 2006
Author: mwh
Date: Fri Mar 10 11:34:51 2006
New Revision: 24206
Modified:
pypy/dist/pypy/rpython/memory/gctransform.py
pypy/dist/pypy/translator/c/test/test_newgc.py
Log:
argh, arrays of Void!
this means using a different check for fixedsizedness (set offset to length to
-1 in the fixed size case) and inserting some special cases in get_type_id. a
few more special cases in primitive.py would probably mean a few less in
gctransform.py but, well.
Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py Fri Mar 10 11:34:51 2006
@@ -666,7 +666,7 @@
TYPE_INFO_TABLE = lltype.Array(TYPE_INFO)
def q_is_varsize(typeid):
- return gcdata.type_info_table[typeid].varitemsize != 0
+ return gcdata.type_info_table[typeid].ofstolength != -1
def q_offsets_to_gc_pointers(typeid):
return gcdata.type_info_table[typeid].ofstoptrs
@@ -816,21 +816,29 @@
info["ofstoptrs"] = self.offsets2table(offsets)
if not TYPE._is_varsize():
info["fixedsize"] = llmemory.sizeof(TYPE)
+ info["ofstolength"] = -1
else:
info["fixedsize"] = llmemory.sizeof(TYPE, 0)
if isinstance(TYPE, lltype.Struct):
ARRAY = TYPE._flds[TYPE._arrayfld]
ofs1 = llmemory.offsetof(TYPE, TYPE._arrayfld)
info["ofstolength"] = ofs1
- info["ofstovar"] = ofs1 + llmemory.itemoffsetof(ARRAY, 0)
+ if ARRAY.OF != lltype.Void:
+ info["ofstovar"] = ofs1 + llmemory.itemoffsetof(ARRAY, 0)
+ else:
+ info["fixedsize"] = ofs1 + llmemory.sizeof(lltype.Signed)
else:
ARRAY = TYPE
info["ofstolength"] = llmemory.ArrayLengthOffset(ARRAY)
- info["ofstovar"] = llmemory.itemoffsetof(TYPE, 0)
+ if ARRAY.OF != lltype.Void:
+ info["ofstovar"] = llmemory.itemoffsetof(TYPE, 0)
+ else:
+ info["fixedsize"] = llmemory.ArrayLengthOffset(ARRAY) + llmemory.sizeof(lltype.Signed)
assert isinstance(ARRAY, lltype.Array)
- offsets = offsets_to_gc_pointers(ARRAY.OF)
- info["varofstoptrs"] = self.offsets2table(offsets)
- info["varitemsize"] = llmemory.sizeof(ARRAY.OF)
+ if ARRAY.OF != lltype.Void:
+ offsets = offsets_to_gc_pointers(ARRAY.OF)
+ info["varofstoptrs"] = self.offsets2table(offsets)
+ info["varitemsize"] = llmemory.sizeof(ARRAY.OF)
return type_id
def consider_constant(self, TYPE, value):
Modified: pypy/dist/pypy/translator/c/test/test_newgc.py
==============================================================================
--- pypy/dist/pypy/translator/c/test/test_newgc.py (original)
+++ pypy/dist/pypy/translator/c/test/test_newgc.py Fri Mar 10 11:34:51 2006
@@ -284,3 +284,14 @@
fn = self.getcompiled(f)
res = fn()
assert res == 43
+
+ def test_framework_void_array(self):
+ A = lltype.GcArray(lltype.Void)
+ a = lltype.malloc(A, 44)
+ def f():
+ return len(a)
+ fn = self.getcompiled(f)
+ res = fn()
+ assert res == 44
+
+
More information about the Pypy-commit
mailing list