Author: Antonio Cuni <anto.c...@gmail.com> Branch: Changeset: r51389:c1b66ebfb441 Date: 2012-01-17 11:29 +0100 http://bitbucket.org/pypy/pypy/changeset/c1b66ebfb441/
Log: (benol) merge the jvm-improvements branch, which fixes (again :-)) the translation for the JVM backend diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -2,6 +2,9 @@ *.py[co] *~ .*.swp +.idea +.project +.pydevproject syntax: regexp ^testresult$ diff --git a/pypy/rlib/longlong2float.py b/pypy/rlib/longlong2float.py --- a/pypy/rlib/longlong2float.py +++ b/pypy/rlib/longlong2float.py @@ -79,19 +79,23 @@ longlong2float = rffi.llexternal( "pypy__longlong2float", [rffi.LONGLONG], rffi.DOUBLE, _callable=longlong2float_emulator, compilation_info=eci, - _nowrapper=True, elidable_function=True, sandboxsafe=True) + _nowrapper=True, elidable_function=True, sandboxsafe=True, + oo_primitive="pypy__longlong2float") float2longlong = rffi.llexternal( "pypy__float2longlong", [rffi.DOUBLE], rffi.LONGLONG, _callable=float2longlong_emulator, compilation_info=eci, - _nowrapper=True, elidable_function=True, sandboxsafe=True) + _nowrapper=True, elidable_function=True, sandboxsafe=True, + oo_primitive="pypy__float2longlong") uint2singlefloat = rffi.llexternal( "pypy__uint2singlefloat", [rffi.UINT], rffi.FLOAT, _callable=uint2singlefloat_emulator, compilation_info=eci, - _nowrapper=True, elidable_function=True, sandboxsafe=True) + _nowrapper=True, elidable_function=True, sandboxsafe=True, + oo_primitive="pypy__uint2singlefloat") singlefloat2uint = rffi.llexternal( "pypy__singlefloat2uint", [rffi.FLOAT], rffi.UINT, _callable=singlefloat2uint_emulator, compilation_info=eci, - _nowrapper=True, elidable_function=True, sandboxsafe=True) + _nowrapper=True, elidable_function=True, sandboxsafe=True, + oo_primitive="pypy__singlefloat2uint") diff --git a/pypy/rlib/objectmodel.py b/pypy/rlib/objectmodel.py --- a/pypy/rlib/objectmodel.py +++ b/pypy/rlib/objectmodel.py @@ -420,7 +420,7 @@ vobj.concretetype.TO._gckind == 'gc') else: from pypy.rpython.ootypesystem import ootype - ok = isinstance(vobj.concretetype, ootype.Instance) + ok = isinstance(vobj.concretetype, (ootype.Instance, ootype.BuiltinType)) if not ok: from pypy.rpython.error import TyperError raise TyperError("compute_unique_id() cannot be applied to" diff --git a/pypy/rpython/ootypesystem/ootype.py b/pypy/rpython/ootypesystem/ootype.py --- a/pypy/rpython/ootypesystem/ootype.py +++ b/pypy/rpython/ootypesystem/ootype.py @@ -512,6 +512,7 @@ "ll_append_char": Meth([CHARTP], Void), "ll_append": Meth([STRINGTP], Void), "ll_build": Meth([], STRINGTP), + "ll_getlength": Meth([], Signed), }) self._setup_methods({}) @@ -1376,6 +1377,9 @@ def _cast_to_object(self): return make_object(self) + def _identityhash(self): + return object.__hash__(self) + class _string(_builtin_type): def __init__(self, STRING, value = ''): @@ -1543,6 +1547,9 @@ else: return make_unicode(u''.join(self._buf)) + def ll_getlength(self): + return self.ll_build().ll_strlen() + class _null_string_builder(_null_mixin(_string_builder), _string_builder): def __init__(self, STRING_BUILDER): self.__dict__["_TYPE"] = STRING_BUILDER diff --git a/pypy/rpython/ootypesystem/rbuilder.py b/pypy/rpython/ootypesystem/rbuilder.py --- a/pypy/rpython/ootypesystem/rbuilder.py +++ b/pypy/rpython/ootypesystem/rbuilder.py @@ -21,6 +21,10 @@ builder.ll_append_char(char) @staticmethod + def ll_getlength(builder): + return builder.ll_getlength() + + @staticmethod def ll_append(builder, string): builder.ll_append(string) diff --git a/pypy/rpython/test/test_rbuilder.py b/pypy/rpython/test/test_rbuilder.py --- a/pypy/rpython/test/test_rbuilder.py +++ b/pypy/rpython/test/test_rbuilder.py @@ -124,9 +124,5 @@ pass class TestOOtype(BaseTestStringBuilder, OORtypeMixin): - def test_string_getlength(self): - py.test.skip("getlength(): not implemented on ootype") - def test_unicode_getlength(self): - py.test.skip("getlength(): not implemented on ootype") def test_append_charpsize(self): py.test.skip("append_charpsize(): not implemented on ootype") diff --git a/pypy/rpython/test/test_rbuiltin.py b/pypy/rpython/test/test_rbuiltin.py --- a/pypy/rpython/test/test_rbuiltin.py +++ b/pypy/rpython/test/test_rbuiltin.py @@ -463,6 +463,31 @@ assert x1 == intmask(x0) assert x3 == intmask(x2) + def test_id_on_builtins(self): + from pypy.rlib.objectmodel import compute_unique_id + from pypy.rlib.rstring import StringBuilder, UnicodeBuilder + def fn(): + return (compute_unique_id("foo"), + compute_unique_id(u"bar"), + compute_unique_id([1]), + compute_unique_id({"foo": 3}), + compute_unique_id(StringBuilder()), + compute_unique_id(UnicodeBuilder())) + res = self.interpret(fn, []) + for id in self.ll_unpack_tuple(res, 6): + assert isinstance(id, (int, r_longlong)) + + def test_uniqueness_of_id_on_strings(self): + from pypy.rlib.objectmodel import compute_unique_id + def fn(s1, s2): + return (compute_unique_id(s1), compute_unique_id(s2)) + + s1 = "foo" + s2 = ''.join(['f','oo']) + res = self.interpret(fn, [self.string_to_ll(s1), self.string_to_ll(s2)]) + i1, i2 = self.ll_unpack_tuple(res, 2) + assert i1 != i2 + def test_cast_primitive(self): from pypy.rpython.annlowlevel import LowLevelAnnotatorPolicy def llf(u): diff --git a/pypy/translator/jvm/builtin.py b/pypy/translator/jvm/builtin.py --- a/pypy/translator/jvm/builtin.py +++ b/pypy/translator/jvm/builtin.py @@ -84,6 +84,9 @@ (ootype.StringBuilder.__class__, "ll_build"): jvm.Method.v(jStringBuilder, "toString", (), jString), + (ootype.StringBuilder.__class__, "ll_getlength"): + jvm.Method.v(jStringBuilder, "length", (), jInt), + (ootype.String.__class__, "ll_hash"): jvm.Method.v(jString, "hashCode", (), jInt), diff --git a/pypy/translator/jvm/database.py b/pypy/translator/jvm/database.py --- a/pypy/translator/jvm/database.py +++ b/pypy/translator/jvm/database.py @@ -358,7 +358,7 @@ ootype.Unsigned:jvm.PYPYSERIALIZEUINT, ootype.SignedLongLong:jvm.LONGTOSTRINGL, ootype.UnsignedLongLong: jvm.PYPYSERIALIZEULONG, - ootype.Float:jvm.DOUBLETOSTRINGD, + ootype.Float:jvm.PYPYSERIALIZEDOUBLE, ootype.Bool:jvm.PYPYSERIALIZEBOOLEAN, ootype.Void:jvm.PYPYSERIALIZEVOID, ootype.Char:jvm.PYPYESCAPEDCHAR, diff --git a/pypy/translator/jvm/metavm.py b/pypy/translator/jvm/metavm.py --- a/pypy/translator/jvm/metavm.py +++ b/pypy/translator/jvm/metavm.py @@ -92,6 +92,7 @@ CASTS = { # FROM TO (ootype.Signed, ootype.UnsignedLongLong): jvm.I2L, + (ootype.Unsigned, ootype.UnsignedLongLong): jvm.I2L, (ootype.SignedLongLong, ootype.Signed): jvm.L2I, (ootype.UnsignedLongLong, ootype.Unsigned): jvm.L2I, (ootype.UnsignedLongLong, ootype.Signed): jvm.L2I, diff --git a/pypy/translator/jvm/opcodes.py b/pypy/translator/jvm/opcodes.py --- a/pypy/translator/jvm/opcodes.py +++ b/pypy/translator/jvm/opcodes.py @@ -101,6 +101,7 @@ 'jit_force_virtualizable': Ignore, 'jit_force_virtual': DoNothing, 'jit_force_quasi_immutable': Ignore, + 'jit_is_virtual': PushPrimitive(ootype.Bool, False), 'debug_assert': [], # TODO: implement? 'debug_start_traceback': Ignore, diff --git a/pypy/translator/jvm/src/pypy/PyPy.java b/pypy/translator/jvm/src/pypy/PyPy.java --- a/pypy/translator/jvm/src/pypy/PyPy.java +++ b/pypy/translator/jvm/src/pypy/PyPy.java @@ -283,6 +283,14 @@ } } + public double pypy__longlong2float(long l) { + return Double.longBitsToDouble(l); + } + + public long pypy__float2longlong(double d) { + return Double.doubleToRawLongBits(d); + } + public double ooparse_float(String s) { try { return Double.parseDouble(s); @@ -353,6 +361,19 @@ return "False"; } + public static String serialize_double(double d) { + if (Double.isNaN(d)) { + return "float(\"nan\")"; + } else if (Double.isInfinite(d)) { + if (d > 0) + return "float(\"inf\")"; + else + return "float(\"-inf\")"; + } else { + return Double.toString(d); + } + } + private static String format_char(char c) { String res = "\\x"; if (c <= 0x0F) res = res + "0"; diff --git a/pypy/translator/jvm/test/runtest.py b/pypy/translator/jvm/test/runtest.py --- a/pypy/translator/jvm/test/runtest.py +++ b/pypy/translator/jvm/test/runtest.py @@ -56,6 +56,7 @@ # CLI could-be duplicate class JvmGeneratedSourceWrapper(object): + def __init__(self, gensrc): """ gensrc is an instance of JvmGeneratedSource """ self.gensrc = gensrc diff --git a/pypy/translator/jvm/test/test_builder.py b/pypy/translator/jvm/test/test_builder.py new file mode 100644 --- /dev/null +++ b/pypy/translator/jvm/test/test_builder.py @@ -0,0 +1,7 @@ +from pypy.translator.jvm.test.runtest import JvmTest +from pypy.rpython.test.test_rbuilder import BaseTestStringBuilder +import py + +class TestJvmStringBuilder(JvmTest, BaseTestStringBuilder): + def test_append_charpsize(self): + py.test.skip("append_charpsize(): not implemented on ootype") diff --git a/pypy/translator/jvm/test/test_longlong2float.py b/pypy/translator/jvm/test/test_longlong2float.py new file mode 100644 --- /dev/null +++ b/pypy/translator/jvm/test/test_longlong2float.py @@ -0,0 +1,20 @@ +from pypy.translator.jvm.test.runtest import JvmTest +from pypy.rlib.longlong2float import * +from pypy.rlib.test.test_longlong2float import enum_floats +from pypy.rlib.test.test_longlong2float import fn as float2longlong2float +import py + +class TestLongLong2Float(JvmTest): + + def test_float2longlong_and_longlong2float(self): + def func(f): + return float2longlong2float(f) + + for f in enum_floats(): + assert repr(f) == repr(self.interpret(func, [f])) + + def test_uint2singlefloat(self): + py.test.skip("uint2singlefloat is not implemented in ootype") + + def test_singlefloat2uint(self): + py.test.skip("singlefloat2uint is not implemented in ootype") diff --git a/pypy/translator/jvm/typesystem.py b/pypy/translator/jvm/typesystem.py --- a/pypy/translator/jvm/typesystem.py +++ b/pypy/translator/jvm/typesystem.py @@ -955,6 +955,7 @@ PYPYSERIALIZEUINT = Method.s(jPyPy, 'serialize_uint', (jInt,), jString) PYPYSERIALIZEULONG = Method.s(jPyPy, 'serialize_ulonglong', (jLong,),jString) PYPYSERIALIZEVOID = Method.s(jPyPy, 'serialize_void', (), jString) +PYPYSERIALIZEDOUBLE = Method.s(jPyPy, 'serialize_double', (jDouble,), jString) PYPYESCAPEDCHAR = Method.s(jPyPy, 'escaped_char', (jChar,), jString) PYPYESCAPEDUNICHAR = Method.s(jPyPy, 'escaped_unichar', (jChar,), jString) PYPYESCAPEDSTRING = Method.s(jPyPy, 'escaped_string', (jString,), jString) diff --git a/pypy/translator/oosupport/test_template/cast.py b/pypy/translator/oosupport/test_template/cast.py --- a/pypy/translator/oosupport/test_template/cast.py +++ b/pypy/translator/oosupport/test_template/cast.py @@ -13,6 +13,9 @@ def to_longlong(x): return r_longlong(x) +def to_ulonglong(x): + return r_ulonglong(x) + def uint_to_int(x): return intmask(x) @@ -56,6 +59,9 @@ def test_unsignedlonglong_to_unsigned4(self): self.check(to_uint, [r_ulonglong(18446744073709551615l)]) # max 64 bit num + def test_unsigned_to_usignedlonglong(self): + self.check(to_ulonglong, [r_uint(42)]) + def test_uint_to_int(self): self.check(uint_to_int, [r_uint(sys.maxint+1)]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit