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

arigo at codespeak.net arigo at codespeak.net
Mon Sep 10 20:08:06 CEST 2007


Author: arigo
Date: Mon Sep 10 20:08:06 2007
New Revision: 46458

Modified:
   pypy/dist/pypy/rpython/lltypesystem/llmemory.py
   pypy/dist/pypy/rpython/lltypesystem/test/test_llmemory.py
Log:
Basic operations in llmemory.


Modified: pypy/dist/pypy/rpython/lltypesystem/llmemory.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/llmemory.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/llmemory.py	Mon Sep 10 20:08:06 2007
@@ -515,7 +515,7 @@
             s = 'NULL'
         else:
             s = str(self.ref)
-        return '<fakeweakaddr %s>' % (s,)
+        return '<%s %s>' % (self.__class__.__name__, s)
     def cast_to_int(self):
         # this is not always the behaviour that is really happening
         # but make sure that nobody depends on it
@@ -540,6 +540,26 @@
 
 # ____________________________________________________________
 
+WeakGcRefOpaque = lltype.OpaqueType('WeakGcRef')
+
+def weakgcref_init(wropaque, obj):
+    PTRTYPE = lltype.typeOf(obj)
+    assert isinstance(PTRTYPE, lltype.Ptr)
+    assert PTRTYPE.TO._gckind == 'gc'
+    wropaque._obj.ref = weakref.ref(lltype.normalizeptr(obj))
+
+def weakgcref_get(PTRTYPE, wropaque):
+    assert isinstance(PTRTYPE, lltype.Ptr)
+    assert PTRTYPE.TO._gckind == 'gc'
+    assert lltype.typeOf(wropaque) == lltype.Ptr(WeakGcRefOpaque)
+    p = wropaque._obj.ref()
+    if p is None:
+        return lltype.nullptr(PTRTYPE.TO)
+    else:
+        return lltype.cast_pointer(PTRTYPE, p)
+
+# ____________________________________________________________
+
 def raw_malloc(size):
     if not isinstance(size, AddressOffset):
         raise NotImplementedError(size)

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	Mon Sep 10 20:08:06 2007
@@ -573,6 +573,19 @@
     assert s2_ptr.x == 2
     # release(start)
 
+def test_weakref():
+    S = lltype.GcStruct('S', ('x',lltype.Signed))
+    s = lltype.malloc(S)
+    o = lltype.malloc(WeakGcRefOpaque, flavor='raw')
+    weakgcref_init(o, s)
+    assert weakgcref_get(lltype.Ptr(S), o) == s
+    assert weakgcref_get(lltype.Ptr(S), o) == s
+    del s
+    import gc; gc.collect()
+    assert weakgcref_get(lltype.Ptr(S), o) == lltype.nullptr(S)
+    lltype.free(o, flavor='raw')
+    py.test.raises(RuntimeError, weakgcref_get, lltype.Ptr(S), o)
+
 class TestWeakAddressLLinterp(object):
     def test_null(self):
         from pypy.rlib.objectmodel import cast_weakgcaddress_to_object



More information about the Pypy-commit mailing list