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

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Apr 26 15:45:52 CEST 2006


Author: cfbolz
Date: Wed Apr 26 15:45:51 2006
New Revision: 26368

Modified:
   pypy/dist/pypy/rpython/objectmodel.py
   pypy/dist/pypy/rpython/test/test_objectmodel.py
Log:
(cfbolz, mwh glancing over shoulder):

add cast_address_to_object and cast_object_to_address to objectmodel


Modified: pypy/dist/pypy/rpython/objectmodel.py
==============================================================================
--- pypy/dist/pypy/rpython/objectmodel.py	(original)
+++ pypy/dist/pypy/rpython/objectmodel.py	Wed Apr 26 15:45:51 2006
@@ -56,6 +56,52 @@
     obj.__dict__ = {}
     obj.__class__ = FREED_OBJECT
 
+def cast_object_to_address(obj):
+    import weakref
+    from pypy.rpython.lltypesystem.llmemory import fakeaddress
+    return fakeaddress(weakref.ref(obj))
+
+def cast_address_to_object(address, expected_result):
+    wref = address.ref().get()
+    if wref is None: # NULL address
+        return None
+    obj = wref()
+    assert obj is not None
+    assert isinstance(obj, expected_result)
+    return obj
+
+from pypy.rpython.extregistry import ExtRegistryEntry
+
+class Entry(ExtRegistryEntry):
+    _about_ = cast_object_to_address
+
+    def compute_result_annotation(self, s_obj):
+        from pypy.annotation import model as annmodel
+        return annmodel.SomeAddress()
+
+    def specialize_call(self, hop):
+        vlist = hop.inputargs(hop.args_r[0])
+        return hop.genop('cast_ptr_to_adr', vlist,
+                         resulttype=hop.r_result.lowleveltype)
+
+class Entry(ExtRegistryEntry):
+    _about_ = cast_address_to_object
+
+    def compute_result_annotation(self, s_int, s_clspbc):
+        from pypy.annotation import model as annmodel
+        assert len(s_clspbc.descriptions) == 1
+        desc = s_clspbc.descriptions.keys()[0]
+        cdef = desc.getuniqueclassdef()
+        return annmodel.SomeInstance(cdef)
+
+    def specialize_call(self, hop):
+        from pypy.rpython import raddress
+        assert isinstance(hop.args_r[0], raddress.AddressRepr)
+        vlist = [hop.inputarg(raddress.address_repr, arg=0)]
+        return hop.genop('cast_adr_to_ptr', vlist,
+                         resulttype = hop.r_result.lowleveltype)
+
+
    
 # __ hlinvoke XXX this doesn't seem completely the right place for this
 

Modified: pypy/dist/pypy/rpython/test/test_objectmodel.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_objectmodel.py	(original)
+++ pypy/dist/pypy/rpython/test/test_objectmodel.py	Wed Apr 26 15:45:51 2006
@@ -69,6 +69,16 @@
     assert d.keys() == []
     return True   # for the tests below
 
+def test_cast_to_and_from_address():
+    class A(object):
+        pass
+    class B(object):
+        pass
+    a = A()
+    addr = cast_object_to_address(a)
+    py.test.raises(AssertionError, "cast_address_to_object(addr, B)")
+    assert a is cast_address_to_object(addr, A)
+
 def test_recursive_r_dict_repr():
     import operator
     rdic = r_dict(operator.eq, hash)



More information about the Pypy-commit mailing list