[pypy-svn] r24082 - in pypy/dist/pypy: rpython/lltypesystem rpython/memory translator/c translator/c/test

mwh at codespeak.net mwh at codespeak.net
Tue Mar 7 18:14:14 CET 2006


Author: mwh
Date: Tue Mar  7 18:14:11 2006
New Revision: 24082

Modified:
   pypy/dist/pypy/rpython/lltypesystem/llmemory.py
   pypy/dist/pypy/rpython/memory/gc.py
   pypy/dist/pypy/rpython/memory/gctransform.py
   pypy/dist/pypy/translator/c/primitive.py
   pypy/dist/pypy/translator/c/test/test_newgc.py
Log:
actually set the length field of an allocated array.
this involved adding a new offset class "ArrayLengthOffset", support for that
in genc, use of it in gctransform.py and actually doing the setting in
MarkSweepGC.malloc (only, so far).


Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py	Tue Mar  7 18:14:11 2006
@@ -89,6 +89,20 @@
     def set(self, ob, value):
         raise Exception("can't assign to an array's items")
 
+class ArrayLengthOffset(AddressOffset):
+
+    def __init__(self, TYPE):
+        self.TYPE = TYPE
+
+    def __repr__(self):
+        return '< ArrayLengthOffset >'
+
+    def get(self, ob):
+        return len(ob)
+
+    def set(self, ob, value):
+        raise Exception("can't assign to an array's length")
+
 
 def sizeof(TYPE, n=None):
     if n is None:

Modified: pypy/dist/pypy/rpython/memory/gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gc.py	(original)
+++ pypy/dist/pypy/rpython/memory/gc.py	Tue Mar  7 18:14:11 2006
@@ -127,6 +127,8 @@
         size_gc_header = self.size_gc_header()
         result = raw_malloc(size + size_gc_header)
 ##         print "mallocing %s, size %s at %s" % (typeid, size, result)
+        if self.is_varsize(typeid):        
+            (result + self.varsize_offset_to_length(typeid)).signed[0] = length
         self.init_gc_object(result, typeid)
         self.malloced_objects.append(result)
         self.bytes_malloced += size + size_gc_header

Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Tue Mar  7 18:14:11 2006
@@ -781,7 +781,7 @@
                     info["ofstovar"] = ofs1 + llmemory.itemoffsetof(ARRAY, 0)
                 else:
                     ARRAY = TYPE
-                    info["ofstolength"] = 0
+                    info["ofstolength"] = llmemory.ArrayLengthOffset(ARRAY)
                     info["ofstovar"] = llmemory.itemoffsetof(TYPE, 0)
                 assert isinstance(ARRAY, lltype.Array)
                 offsets = offsets_to_gc_pointers(ARRAY.OF)

Modified: pypy/dist/pypy/translator/c/primitive.py
==============================================================================
--- pypy/dist/pypy/translator/c/primitive.py	(original)
+++ pypy/dist/pypy/translator/c/primitive.py	Tue Mar  7 18:14:11 2006
@@ -2,7 +2,7 @@
 from pypy.rpython.lltypesystem.lltype import *
 from pypy.rpython.lltypesystem.llmemory import Address, fakeaddress, \
      AddressOffset, ItemOffset, ArrayItemsOffset, FieldOffset, \
-     CompositeOffset
+     CompositeOffset, ArrayLengthOffset
 from pypy.rpython.memory.gc import GCHeaderOffset
 from pypy.rpython.memory.lladdress import NULL
 
@@ -24,6 +24,9 @@
         elif isinstance(value, ArrayItemsOffset):
             return 'offsetof(%s, items)'%(
                 db.gettype(value.TYPE).replace('@', ''))
+        elif isinstance(value, ArrayLengthOffset):
+            return 'offsetof(%s, length)'%(
+                db.gettype(value.TYPE).replace('@', ''))
         elif isinstance(value, CompositeOffset):
             return '%s + %s' % (name_signed(value.first, db), name_signed(value.second, db))
         elif type(value) == AddressOffset:

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	Tue Mar  7 18:14:11 2006
@@ -237,13 +237,12 @@
         assert res == f()
             
 
-    def test_framework_static_roots(self):
-        py.test.skip("not working yet")
+    def test_framework_using_lists(self):
         class A(object):
             pass
-        static_list = []
-        N = 100000
+        N = 1000
         def f():
+            static_list = []
             for i in range(N):
                 a = A()
                 a.x = i



More information about the Pypy-commit mailing list