[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