[pypy-svn] r27482 - in pypy/dist/pypy/rpython: lltypesystem lltypesystem/test memory/test
arigo at codespeak.net
arigo at codespeak.net
Fri May 19 17:15:24 CEST 2006
Author: arigo
Date: Fri May 19 17:15:23 2006
New Revision: 27482
Modified:
pypy/dist/pypy/rpython/lltypesystem/llmemory.py
pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py
Log:
(pedronis, arigo)
Allow addr.address[0] = ... to write into a pointer field.
Some renamings. Now test_cloning works :-)
Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py Fri May 19 17:15:23 2006
@@ -396,18 +396,23 @@
addr = self.addr
if index != 0:
addr += ItemOffset(addr.ref().type(), index)
- return self.convert(addr.get())
+ return self.erase_type(addr.get())
def __setitem__(self, index, value):
+ assert lltype.typeOf(value) == self.TYPE
addr = self.addr
if index != 0:
addr += ItemOffset(addr.ref().type(), index)
- addr.set(value)
+ addr.set(self.unerase_type(addr.ref().type(), value))
- def convert(self, value):
+ def erase_type(self, value):
assert lltype.typeOf(value) == self.TYPE
return value
+ def unerase_type(self, TARGETTYPE, value):
+ assert lltype.typeOf(value) == TARGETTYPE
+ return value
+
class _signed_fakeaccessor(_fakeaccessor):
TYPE = lltype.Signed
@@ -415,17 +420,10 @@
class _char_fakeaccessor(_fakeaccessor):
TYPE = lltype.Char
- def convert(self, value):
- # hack to try to interpret the items of an array of bytes as chars
- if lltype.typeOf(value) == lltype.Signed:
- value = chr(value)
- assert lltype.typeOf(value) == lltype.Char
- return value
-
class _address_fakeaccessor(_fakeaccessor):
TYPE = Address
- def convert(self, value):
+ def erase_type(self, value):
if isinstance(value, lltype._ptr):
return value._cast_to_adr()
elif lltype.typeOf(value) == Address:
@@ -433,6 +431,14 @@
else:
raise TypeError(value)
+ def unerase_type(self, TARGETTYPE, value):
+ if TARGETTYPE == Address:
+ return value
+ elif isinstance(TARGETTYPE, lltype.Ptr):
+ return cast_adr_to_ptr(value, TARGETTYPE)
+ else:
+ raise TypeError(TARGETTYPE, value)
+
fakeaddress.signed = property(_signed_fakeaccessor)
fakeaddress.char = property(_char_fakeaccessor)
Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py Fri May 19 17:15:23 2006
@@ -144,6 +144,18 @@
adr1000 = (adr + ArrayItemsOffset(A) + ItemOffset(lltype.Char, 1000))
assert adr1000.char[-997] == '+'
+ T = lltype.FixedSizeArray(lltype.Char, 10)
+ S = lltype.GcStruct('S', ('z', lltype.Ptr(T)))
+ s = lltype.malloc(S)
+ s.z = lltype.malloc(T, immortal=True)
+ adr = cast_ptr_to_adr(s)
+ assert (adr + offsetof(S, 'z')).address[0] == cast_ptr_to_adr(s.z)
+ (adr + offsetof(S, 'z')).address[0] = NULL
+ assert s.z == lltype.nullptr(T)
+ t = lltype.malloc(T, immortal=True)
+ (adr + offsetof(S, 'z')).address[0] = cast_ptr_to_adr(t)
+ assert s.z == t
+
def test_fakeadr_eq():
S = lltype.GcStruct("S", ("x", lltype.Signed), ("y", lltype.Signed))
s = lltype.malloc(S)
Modified: pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py (original)
+++ pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py Fri May 19 17:15:23 2006
@@ -294,7 +294,6 @@
assert heap_size < 16000 * INT_SIZE / 4 # xxx
def test_cloning(self):
- py.test.skip("in-progress")
B = lltype.GcStruct('B', ('x', lltype.Signed))
A = lltype.GcStruct('A', ('b', lltype.Ptr(B)))
def make(n):
More information about the Pypy-commit
mailing list