[pypy-svn] r30105 - in pypy/dist/pypy/translator/cli: . test

antocuni at codespeak.net antocuni at codespeak.net
Mon Jul 17 10:27:29 CEST 2006


Author: antocuni
Date: Mon Jul 17 10:27:22 2006
New Revision: 30105

Modified:
   pypy/dist/pypy/translator/cli/cts.py
   pypy/dist/pypy/translator/cli/metavm.py
   pypy/dist/pypy/translator/cli/opcodes.py
   pypy/dist/pypy/translator/cli/test/test_objectmodel.py
Log:
Initial support for weak references.



Modified: pypy/dist/pypy/translator/cli/cts.py
==============================================================================
--- pypy/dist/pypy/translator/cli/cts.py	(original)
+++ pypy/dist/pypy/translator/cli/cts.py	Mon Jul 17 10:27:22 2006
@@ -6,6 +6,7 @@
 
 from pypy.rpython.lltypesystem.lltype import SignedLongLong, UnsignedLongLong
 from pypy.rpython.ootypesystem import ootype
+from pypy.rpython.lltypesystem.llmemory import WeakGcAddress
 from pypy.translator.cli.option import getoption
 from pypy.translator.cli import oopspec
 
@@ -14,6 +15,7 @@
 log = py.log.Producer("cli") 
 py.log.setconsumer("cli", ansi_log) 
 
+WEAKREF = '[mscorlib]System.WeakReference'
 PYPY_LIST = '[pypylib]pypy.runtime.List`1<%s>'
 PYPY_LIST_OF_VOID = '[pypylib]pypy.runtime.ListOfVoid'
 PYPY_DICT = '[pypylib]pypy.runtime.Dict`2<%s, %s>'
@@ -35,6 +37,7 @@
     ootype.Class: 'class [mscorlib]System.Type',
     ootype.String: 'string',
     ootype.StringBuilder: 'class ' + PYPY_STRING_BUILDER,
+    WeakGcAddress: 'class ' + WEAKREF,
 
     # maps generic types to their ordinal
     ootype.List.SELFTYPE_T: 'class ' + (PYPY_LIST % '!0'),

Modified: pypy/dist/pypy/translator/cli/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/cli/metavm.py	(original)
+++ pypy/dist/pypy/translator/cli/metavm.py	Mon Jul 17 10:27:22 2006
@@ -117,7 +117,13 @@
                             '[mscorlib]System.Collections.Generic.IEqualityComparer`1<!0>)'
                             % dict_type)
 
-
+class _CastWeakAdrToPtr(MicroInstruction):
+    def render(self, generator, op):
+        RESULTTYPE = op.result.concretetype
+        resulttype = generator.cts.lltype_to_cts(RESULTTYPE)
+        generator.load(op.args[0])
+        generator.ilasm.call_method('object class [mscorlib]System.WeakReference::get_Target()', True)
+        generator.ilasm.opcode('castclass', resulttype)
 
 Call = _Call()
 CallMethod = _CallMethod()
@@ -129,3 +135,4 @@
 OOString = _OOString()
 DownCast = _DownCast()
 NewCustomDict = _NewCustomDict()
+CastWeakAdrToPtr = _CastWeakAdrToPtr()

Modified: pypy/dist/pypy/translator/cli/opcodes.py
==============================================================================
--- pypy/dist/pypy/translator/cli/opcodes.py	(original)
+++ pypy/dist/pypy/translator/cli/opcodes.py	Mon Jul 17 10:27:22 2006
@@ -1,5 +1,6 @@
 from pypy.translator.cli.metavm import  Call, CallMethod, RuntimeNew, \
-     IndirectCall, GetField, SetField, CastTo, OOString, DownCast, NewCustomDict
+     IndirectCall, GetField, SetField, CastTo, OOString, DownCast, NewCustomDict,\
+     CastWeakAdrToPtr
 from pypy.translator.oosupport.metavm import PushArg, PushAllArgs, StoreResult, InstructionList,\
     New
 
@@ -61,6 +62,9 @@
     'direct_call':              [Call],
     'indirect_call':            [IndirectCall],
 
+    'cast_ptr_to_weakadr':      [PushAllArgs, 'newobj instance void class [mscorlib]System.WeakReference::.ctor(object)'],
+    'cast_weakadr_to_ptr':      [CastWeakAdrToPtr],
+
     # __________ numeric operations __________
 
     'bool_not':                 [PushAllArgs]+Not,

Modified: pypy/dist/pypy/translator/cli/test/test_objectmodel.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/test_objectmodel.py	(original)
+++ pypy/dist/pypy/translator/cli/test/test_objectmodel.py	Mon Jul 17 10:27:22 2006
@@ -2,8 +2,31 @@
 from pypy.translator.cli.test.runtest import CliTest
 from pypy.rpython.test.test_objectmodel import BaseTestObjectModel
 
+from pypy.rpython.objectmodel import cast_object_to_weakgcaddress,\
+     cast_weakgcaddress_to_object
+
 def skip_r_dict(self):
     py.test.skip('r_dict support is still incomplete')
 
 class TestCliObjectModel(CliTest, BaseTestObjectModel):
     test_rtype_r_dict_bm = skip_r_dict
+
+    # this test is copied from TestLLtype in
+    # rpython/test_objectmodel.py. It is not in TestOOtype because at
+    # the moment llinterpret can't handle cast_*weakadr*
+    def test_cast_to_and_from_weakaddress(self):
+        class A(object):
+            pass
+        class B(object):
+            pass
+        def f():
+            a = A()
+            addr = cast_object_to_weakgcaddress(a)
+            return a is cast_weakgcaddress_to_object(addr, A)
+        res = self.interpret(f, [])
+        assert res
+##        def g():
+##            a = A()
+##            addr = cast_object_to_weakgcaddress(a)
+##            return cast_weakgcaddress_to_int(addr)
+##        assert isinstance(self.interpret(f, []), int)



More information about the Pypy-commit mailing list