[pypy-svn] r46360 - in pypy/dist/pypy/translator/jvm: . test

antocuni at codespeak.net antocuni at codespeak.net
Wed Sep 5 22:02:37 CEST 2007


Author: antocuni
Date: Wed Sep  5 22:02:35 2007
New Revision: 46360

Modified:
   pypy/dist/pypy/translator/jvm/metavm.py
   pypy/dist/pypy/translator/jvm/opcodes.py
   pypy/dist/pypy/translator/jvm/test/test_cast.py
Log:
implement cast_primitive for jvm



Modified: pypy/dist/pypy/translator/jvm/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/metavm.py	(original)
+++ pypy/dist/pypy/translator/jvm/metavm.py	Wed Sep  5 22:02:35 2007
@@ -1,3 +1,4 @@
+from pypy.rpython.ootypesystem import ootype
 from pypy.translator.oosupport.metavm import MicroInstruction
 from pypy.translator.jvm.typesystem import JvmScalarType, JvmClassType
 import pypy.translator.jvm.generator as jvmgen
@@ -130,3 +131,19 @@
         generator.cast_weak_address_to_ptr(RESULTTYPE)
 CastWeakAddressToPtr = _CastWeakAddressToPtr()
 
+
+CASTS = {
+#   FROM                      TO
+    (ootype.Signed,           ootype.UnsignedLongLong): jvmgen.I2L,
+    (ootype.SignedLongLong,   ootype.Signed):           jvmgen.L2I,
+    (ootype.UnsignedLongLong, ootype.SignedLongLong):   None,
+    }
+
+class _CastPrimitive(MicroInstruction):
+    def render(self, generator, op):
+        FROM = op.args[0].concretetype
+        TO = op.result.concretetype
+        opcode = CASTS[(FROM, TO)]
+        if opcode:
+            generator.emit(opcode)
+CastPrimitive = _CastPrimitive()

Modified: pypy/dist/pypy/translator/jvm/opcodes.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/opcodes.py	(original)
+++ pypy/dist/pypy/translator/jvm/opcodes.py	Wed Sep  5 22:02:35 2007
@@ -10,7 +10,7 @@
      SetField, GetField, DownCast, RuntimeNew, OOString, CastTo, PushPrimitive
 from pypy.translator.jvm.metavm import \
      IndirectCall, JvmCallMethod, TranslateException, NewCustomDict, \
-     CastPtrToWeakAddress, CastWeakAddressToPtr
+     CastPtrToWeakAddress, CastWeakAddressToPtr, CastPrimitive
 from pypy.rpython.ootypesystem import ootype
 
 import pypy.translator.jvm.generator as jvmgen
@@ -243,6 +243,7 @@
     'cast_float_to_uint':       jvmgen.PYPYDOUBLETOUINT,
     'truncate_longlong_to_int': jvmgen.L2I,
     'cast_longlong_to_float':   jvmgen.L2D,
+    'cast_primitive':           [PushAllArgs, CastPrimitive, StoreResult],
     'is_early_constant':        [PushPrimitive(ootype.Bool, False), StoreResult]
     
 }

Modified: pypy/dist/pypy/translator/jvm/test/test_cast.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/test/test_cast.py	(original)
+++ pypy/dist/pypy/translator/jvm/test/test_cast.py	Wed Sep  5 22:02:35 2007
@@ -3,6 +3,12 @@
 from pypy.translator.oosupport.test_template.cast import BaseTestCast
 
 class TestCast(BaseTestCast, JvmTest):
-
     def test_cast_primitive(self):
-        py.test.skip('fixme!')
+        # genjvm has buggy support for ullong, so the original test
+        # doesn't work
+        from pypy.rpython.lltypesystem.lltype import cast_primitive, UnsignedLongLong
+        def f(x):
+            x = cast_primitive(UnsignedLongLong, x)
+            return x
+        res = self.interpret(f, [14])
+        assert res == 14


More information about the pypy-svn mailing list