[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