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

antocuni at codespeak.net antocuni at codespeak.net
Fri Feb 1 15:15:54 CET 2008


Author: antocuni
Date: Fri Feb  1 15:15:52 2008
New Revision: 51182

Modified:
   pypy/dist/pypy/translator/cli/dotnet.py
   pypy/dist/pypy/translator/cli/test/test_dotnet.py
Log:
add an helper to allow downcasts of cli objects



Modified: pypy/dist/pypy/translator/cli/dotnet.py
==============================================================================
--- pypy/dist/pypy/translator/cli/dotnet.py	(original)
+++ pypy/dist/pypy/translator/cli/dotnet.py	Fri Feb  1 15:15:52 2008
@@ -528,6 +528,26 @@
         c_methodname = hop.inputconst(ootype.Void, methodname)
         return hop.genop('cli_eventhandler', [v_obj, c_methodname], hop.r_result.lowleveltype)
 
+
+def clidowncast(cliClass, obj):
+    return obj
+
+class Entry(ExtRegistryEntry):
+    _about_ = clidowncast
+
+    def compute_result_annotation(self, s_type, s_value):
+        assert s_type.is_constant()
+        cliClass = s_type.const
+        TYPE = cliClass._INSTANCE
+        assert ootype.isSubclass(TYPE, s_value.ootype)
+        return SomeOOInstance(TYPE)
+
+    def specialize_call(self, hop):
+        assert isinstance(hop.args_s[0].const, CliClass)
+        assert isinstance(hop.args_s[1], annmodel.SomeOOInstance)
+        v_inst = hop.inputarg(hop.args_r[1], arg=1)
+        return hop.genop('oodowncast', [v_inst], resulttype = hop.r_result.lowleveltype)
+
 from pypy.translator.cli.query import CliNamespace
 CLR = CliNamespace(None)
 CLR._buildtree()

Modified: pypy/dist/pypy/translator/cli/test/test_dotnet.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/test_dotnet.py	(original)
+++ pypy/dist/pypy/translator/cli/test/test_dotnet.py	Fri Feb  1 15:15:52 2008
@@ -7,7 +7,7 @@
 from pypy.translator.cli.test.runtest import CliTest
 from pypy.translator.cli.dotnet import SomeCliClass, SomeCliStaticMethod,\
      NativeInstance, CLR, box, unbox, OverloadingResolver, NativeException,\
-     native_exc, new_array, init_array, typeof, eventhandler
+     native_exc, new_array, init_array, typeof, eventhandler, clidowncast
 
 System = CLR.System
 ArrayList = CLR.System.Collections.ArrayList
@@ -362,6 +362,18 @@
         res = self.interpret(fn, [])
         assert res is True
 
+    def test_clidowncast(self):
+        def fn():
+            a = ArrayList()
+            b = ArrayList()
+            a.Add(b)
+            c = a.get_Item(0) # type of c is Object
+            c = clidowncast(ArrayList, c)
+            c.Add(None)
+            return c.get_Item(0)
+        res = self.interpret(fn, [])
+        assert res is None
+
     def test_mix_None_and_instance(self):
         def g(x):
             return x



More information about the Pypy-commit mailing list