[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