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

antocuni at codespeak.net antocuni at codespeak.net
Mon Mar 17 09:56:30 CET 2008


Author: antocuni
Date: Mon Mar 17 09:56:28 2008
New Revision: 52628

Modified:
   pypy/dist/pypy/translator/cli/constant.py
   pypy/dist/pypy/translator/cli/dotnet.py
   pypy/dist/pypy/translator/cli/test/test_dotnet.py
Log:
now it should really be possible to mix all record instances with
System.Object instances



Modified: pypy/dist/pypy/translator/cli/constant.py
==============================================================================
--- pypy/dist/pypy/translator/cli/constant.py	(original)
+++ pypy/dist/pypy/translator/cli/constant.py	Mon Mar 17 09:56:28 2008
@@ -83,20 +83,20 @@
     def downcast_constant(self, gen, const, EXPECTED_TYPE):
         type = self.cts.lltype_to_cts(EXPECTED_TYPE)
         gen.ilasm.opcode('castclass', type)
-
+ 
     def _get_key_for_const(self, value):
-        from pypy.translator.cli.dotnet import _record_view
-        if isinstance(value, _record_view):
-            return value._record
+        if isinstance(value, ootype._view) and isinstance(value._inst, ootype._record):
+            return value._inst
         return BaseConstantGenerator._get_key_for_const(self, value)
 
     def _create_complex_const(self, value):
-        from pypy.translator.cli.dotnet import _fieldinfo, _record_view
+        from pypy.translator.cli.dotnet import _fieldinfo
+
         if isinstance(value, _fieldinfo):
             uniq = self.db.unique()
             return CLIFieldInfoConst(self.db, value.llvalue, uniq)
-        elif isinstance(value, _record_view):
-            return self.record_const(value._record)
+        elif isinstance(value, ootype._view) and isinstance(value._inst, ootype._record):
+            return self.record_const(value._inst)
         else:
             return BaseConstantGenerator._create_complex_const(self, value)
 

Modified: pypy/dist/pypy/translator/cli/dotnet.py
==============================================================================
--- pypy/dist/pypy/translator/cli/dotnet.py	(original)
+++ pypy/dist/pypy/translator/cli/dotnet.py	Mon Mar 17 09:56:28 2008
@@ -633,37 +633,16 @@
         v_inst = hop.inputarg(hop.args_r[0], arg=0)
         return hop.genop('oodowncast', [v_inst], resulttype = hop.r_result.lowleveltype)
 
-class _record_view(object):
-    
-    def __init__(self, record):
-        self._record = record
-        self._TYPE = CLR.System.Object._INSTANCE
-
-    def __ne__(self, other):
-        return not (self == other)
-
-    def __eq__(self, other):
-        if isinstance(other, ootype._record):
-            return self._record == other
-        assert isinstance(other, _record_view)
-        return self._record == other._record
-
-    def __hash__(self):
-        return hash(self._record)
-
-    def __nonzero__(self):
-        return bool(self._record)
-
-
 def cast_record_to_object(record):
     T = ootype.typeOf(record)
     assert isinstance(T, ootype.Record)
-    return _record_view(record)
+    return ootype._view(CLR.System.Object._INSTANCE, record)
 
 def cast_object_to_record(T, obj):
     assert isinstance(T, ootype.Record)
-    assert isinstance(obj, _record_view)
-    record = obj._record
+    assert isinstance(obj, ootype._view)
+    assert isinstance(obj._inst, ootype._record)
+    record = obj._inst
     assert ootype.typeOf(record) == T
     return record
 

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	Mon Mar 17 09:56:28 2008
@@ -641,7 +641,7 @@
         res = self.interpret(fn, [True])
         assert res == 'Int32'
 
-    def test_mix_record_and_object(self):
+    def test_cast_record(self):
         T = ootype.Record({'x': ootype.Signed})
         record = ootype.new(T)
         def fn(flag):
@@ -665,6 +665,14 @@
         res = self.interpret(fn, [])
         assert res
 
+    def test_cast_record_mix_object(self):
+        T = ootype.Record({'x': ootype.Signed})
+        NULL = ootype.null(System.Object._INSTANCE)
+        record = cast_record_to_object(ootype.new(T))
+        assert record != NULL
+        assert NULL != record
+        
+
 class TestPythonnet(TestDotnetRtyping):
     # don't interpreter functions but execute them directly through pythonnet
     def interpret(self, f, args, backendopt='ignored'):



More information about the Pypy-commit mailing list