[pypy-svn] r46233 - in pypy/dist/pypy/translator/jvm: . src/pypy test
antocuni at codespeak.net
antocuni at codespeak.net
Sat Sep 1 11:35:42 CEST 2007
Author: antocuni
Date: Sat Sep 1 11:35:42 2007
New Revision: 46233
Modified:
pypy/dist/pypy/translator/jvm/database.py
pypy/dist/pypy/translator/jvm/generator.py
pypy/dist/pypy/translator/jvm/opcodes.py
pypy/dist/pypy/translator/jvm/src/pypy/PyPy.java
pypy/dist/pypy/translator/jvm/test/test_runtest.py
Log:
implement ullong_mod.
Modified: pypy/dist/pypy/translator/jvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/database.py (original)
+++ pypy/dist/pypy/translator/jvm/database.py Sat Sep 1 11:35:42 2007
@@ -404,6 +404,7 @@
ootype.Signed:jvmgen.INTTOSTRINGI,
ootype.Unsigned:jvmgen.PYPYSERIALIZEUINT,
ootype.SignedLongLong:jvmgen.LONGTOSTRINGL,
+ ootype.UnsignedLongLong: jvmgen.PYPYSERIALIZEULONG,
ootype.Float:jvmgen.DOUBLETOSTRINGD,
ootype.Bool:jvmgen.PYPYSERIALIZEBOOLEAN,
ootype.Void:jvmgen.PYPYSERIALIZEVOID,
Modified: pypy/dist/pypy/translator/jvm/generator.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/generator.py (original)
+++ pypy/dist/pypy/translator/jvm/generator.py Sat Sep 1 11:35:42 2007
@@ -394,6 +394,7 @@
PYPYUINTCMP = Method.s(jPyPy, 'uint_cmp', (jInt,jInt,), jInt)
PYPYULONGCMP = Method.s(jPyPy, 'ulong_cmp', (jLong,jLong), jInt)
PYPYUINTMOD = Method.s(jPyPy, 'uint_mod', (jInt, jInt), jInt)
+PYPYULONGMOD = Method.s(jPyPy, 'ulong_mod', (jLong, jLong), jLong)
PYPYUINTTODOUBLE = Method.s(jPyPy, 'uint_to_double', (jInt,), jDouble)
PYPYDOUBLETOUINT = Method.s(jPyPy, 'double_to_uint', (jDouble,), jInt)
PYPYDOUBLETOLONG = Method.s(jPyPy, 'double_to_long', (jDouble,), jLong) #PAUL
@@ -410,6 +411,7 @@
PYPYDUMPEXCWRAPPER = Method.s(jPyPy, 'dump_exc_wrapper', (jObject,), jVoid)
PYPYSERIALIZEBOOLEAN = Method.s(jPyPy, 'serialize_boolean', (jBool,), jString)
PYPYSERIALIZEUINT = Method.s(jPyPy, 'serialize_uint', (jInt,), jString)
+PYPYSERIALIZEULONG = Method.s(jPyPy, 'serialize_ulonglong', (jLong,), jString)
PYPYSERIALIZEVOID = Method.s(jPyPy, 'serialize_void', (), jString)
PYPYESCAPEDCHAR = Method.s(jPyPy, 'escaped_char', (jChar,), jString)
PYPYESCAPEDSTRING = Method.s(jPyPy, 'escaped_string', (jString,), jString)
Modified: pypy/dist/pypy/translator/jvm/opcodes.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/opcodes.py (original)
+++ pypy/dist/pypy/translator/jvm/opcodes.py Sat Sep 1 11:35:42 2007
@@ -210,8 +210,8 @@
'ullong_div': jvmgen.LDIV, # valid?
'ullong_truediv': None, # TODO
'ullong_floordiv': jvmgen.LDIV, # valid?
- 'ullong_mod': jvmgen.LREM, # valid?
- 'ullong_mod_zer': _check_zer(jvmgen.LREM),
+ 'ullong_mod': jvmgen.PYPYULONGMOD,
+ 'ullong_mod_zer': _check_zer(jvmgen.PYPYULONGMOD),
'ullong_lt': 'ulong_less_than',
'ullong_le': 'ulong_less_equals',
'ullong_eq': 'ulong_equals',
Modified: pypy/dist/pypy/translator/jvm/src/pypy/PyPy.java
==============================================================================
--- pypy/dist/pypy/translator/jvm/src/pypy/PyPy.java (original)
+++ pypy/dist/pypy/translator/jvm/src/pypy/PyPy.java Sat Sep 1 11:35:42 2007
@@ -5,6 +5,7 @@
import java.util.HashMap;
import java.util.Arrays;
import java.util.Map;
+import java.text.DecimalFormat;
/**
* Class with a number of utility routines.
@@ -72,6 +73,12 @@
return (int)modulo;
}
+ public static long ulong_mod(long x, long y) {
+ double dx = ulong_to_double(x);
+ double modulo = Math.IEEEremainder(dx, y);
+ return (long)modulo;
+ }
+
public static int ulong_cmp(long value1, long value2) {
final int VALUE2BIGGER = -1;
final int VALUE1BIGGER = 1;
@@ -116,6 +123,17 @@
}
}
+ public static double ulong_to_double(long value) {
+ if (value >= 0)
+ return value;
+ else {
+ long lopart = value & 0xFFFFFFFF;
+ long hipart = value >>> 32;
+ double result = (hipart << 32) | lopart;
+ return result;
+ }
+ }
+
public static int double_to_uint(double value) {
if (value <= Integer.MAX_VALUE)
return (int)value;
@@ -249,6 +267,13 @@
}
}
+ public static String serialize_ulonglong(long value)
+ {
+ double d = ulong_to_double(value);
+ DecimalFormat fmt = new DecimalFormat("0");
+ return fmt.format(d);
+ }
+
public static String serialize_boolean(boolean l) {
if (l)
return "True";
Modified: pypy/dist/pypy/translator/jvm/test/test_runtest.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/test/test_runtest.py (original)
+++ pypy/dist/pypy/translator/jvm/test/test_runtest.py Sat Sep 1 11:35:42 2007
@@ -1,6 +1,8 @@
+import sys
from pypy.translator.jvm.test.runtest import JvmTest
from pypy.translator.jvm.test.runtest import FLOAT_PRECISION
from pypy.annotation.listdef import s_list_of_strings
+from pypy.rlib.rarithmetic import r_ulonglong
def ident(x):
return x
@@ -64,3 +66,6 @@
else:
return None
assert self.interpret(fn, [False]) is None
+
+ def test_ullong(self):
+ assert self.interpret(ident, [r_ulonglong(sys.maxint+1)]) == sys.maxint+1
More information about the Pypy-commit
mailing list