[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