[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