[pypy-svn] r27377 - in pypy/dist/pypy/rpython/lltypesystem: . test

pedronis at codespeak.net pedronis at codespeak.net
Wed May 17 22:59:18 CEST 2006


Author: pedronis
Date: Wed May 17 22:59:17 2006
New Revision: 27377

Modified:
   pypy/dist/pypy/rpython/lltypesystem/llmemory.py
   pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
Log:
another test, an xxx


Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py	Wed May 17 22:59:17 2006
@@ -499,8 +499,9 @@
     return size.raw_malloc([])
 
 def raw_free(adr):
+    # xxx crash if you get only the header of a gc object
     assert isinstance(adr.ob._obj, lltype._parentable)
-    adr.ob._obj._free()
+    adr.ob._as_obj()._free()
 
 def raw_malloc_usage(size):
     if isinstance(size, AddressOffset):

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	Wed May 17 22:59:17 2006
@@ -339,7 +339,59 @@
     py.test.raises(RuntimeError, "p_u.y = 2")
     repr(adr)
     str(p_u)
+
+def test_raw_free_with_hdr():
+    from pypy.rpython.memory.gcheader import GCHeaderBuilder
+    
+    HDR = lltype.Struct('h', ('t', lltype.Signed))
+    gh = GCHeaderBuilder(HDR).size_gc_header
+    
+    A = lltype.GcArray(lltype.Signed)
+    adr = raw_malloc(gh+sizeof(A, 10))
+    p_a = cast_adr_to_ptr(adr+gh, lltype.Ptr(A))
+    p_a[0] = 1
+    adr = cast_ptr_to_adr(p_a)-gh
+    raw_free(adr)
+    py.test.raises(RuntimeError, "p_a[0]")
+    py.test.raises(RuntimeError, "p_a[0] = 2")
+    repr(adr)
+    str(p_a)
+
+    S = lltype.GcStruct('S', ('x', lltype.Signed))
+    adr = raw_malloc(gh+sizeof(S))
+    p_s = cast_adr_to_ptr(adr+gh, lltype.Ptr(S))
+    p_s.x = 1
+    adr = cast_ptr_to_adr(p_s)-gh
+    raw_free(adr)
+    py.test.raises(RuntimeError, "p_s.x")
+    py.test.raises(RuntimeError, "p_s.x = 2")
+    repr(adr)
+    str(p_s)
     
+    T = lltype.GcStruct('T', ('s', S))
+    adr = raw_malloc(gh+sizeof(T))
+    p_s = cast_adr_to_ptr(adr+gh, lltype.Ptr(S))
+    p_s.x = 1
+    adr = cast_ptr_to_adr(p_s)-gh
+    raw_free(adr)
+    py.test.raises(RuntimeError, "p_s.x")
+    py.test.raises(RuntimeError, "p_s.x = 2")
+    repr(adr)
+    str(p_s)
+    
+    U = lltype.Struct('U', ('y', lltype.Signed))
+    T = lltype.GcStruct('T', ('x', lltype.Signed), ('u', U))
+    adr = raw_malloc(gh+sizeof(T))
+    p_t = cast_adr_to_ptr(adr+gh, lltype.Ptr(T))
+    p_u = p_t.u
+    p_u.y = 1
+    adr = cast_ptr_to_adr(p_t)-gh
+    raw_free(adr)
+    py.test.raises(RuntimeError, "p_u.y")
+    py.test.raises(RuntimeError, "p_u.y = 2")
+    repr(adr)
+    str(p_u)
+
 def test_inlined_substruct():
     T = lltype.Struct('T', ('x', lltype.Signed))
     S1 = lltype.GcStruct('S1', ('t1', T), ('t2', T))



More information about the Pypy-commit mailing list