[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