Using floor when converting from double, float to int, long. Support for more than four parameters
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 27 Aug 2012 06:12:35 +0200
changeset 3e44f0155d946
parent 2 4679bf342a1f
child 4 f352a33fb71b
Using floor when converting from double, float to int, long. Support for more than four parameters
src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java
src/test/java/org/apidesign/java4browser/StaticMethod.java
src/test/java/org/apidesign/java4browser/StaticMethodTest.java
     1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Mon Aug 27 05:47:44 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Mon Aug 27 06:12:35 2012 +0200
     1.3 @@ -72,7 +72,7 @@
     1.4              out.append("arg").append(String.valueOf(index));
     1.5              space = ",";
     1.6              final String desc = args.get(i).getDescriptor();
     1.7 -            if ("D".equals(desc)) {
     1.8 +            if ("D".equals(desc) || "J".equals(desc)) {
     1.9                  index += 2;
    1.10              } else {
    1.11                  index++;
    1.12 @@ -121,6 +121,22 @@
    1.13                  case bc_dload_2:
    1.14                      out.append("stack.push(arg2);");
    1.15                      break;
    1.16 +                case bc_aload_3:
    1.17 +                case bc_iload_3:
    1.18 +                case bc_lload_3:
    1.19 +                case bc_fload_3:
    1.20 +                case bc_dload_3:
    1.21 +                    out.append("stack.push(arg3);");
    1.22 +                    break;
    1.23 +                case bc_iload:
    1.24 +                case bc_lload:
    1.25 +                case bc_fload:
    1.26 +                case bc_dload:
    1.27 +                case bc_aload: {
    1.28 +                    final int indx = (byteCodes[++i] + 256) % 256;
    1.29 +                    out.append("stack.push(arg").append(indx + ");");
    1.30 +                    break;
    1.31 +                }
    1.32                  case bc_iadd:
    1.33                  case bc_ladd:
    1.34                  case bc_fadd:
    1.35 @@ -131,7 +147,7 @@
    1.36                  case bc_lsub:
    1.37                  case bc_fsub:
    1.38                  case bc_dsub:
    1.39 -                    out.append("stack.push(- stack.pop() + stack.pop());");
    1.40 +                    out.append("{ var tmp = stack.pop(); stack.push(stack.pop() - tmp); }");
    1.41                      break;
    1.42                  case bc_imul:
    1.43                  case bc_lmul:
    1.44 @@ -139,6 +155,14 @@
    1.45                  case bc_dmul:
    1.46                      out.append("stack.push(stack.pop() * stack.pop());");
    1.47                      break;
    1.48 +                case bc_idiv:
    1.49 +                case bc_ldiv:
    1.50 +                    out.append("{ var tmp = stack.pop(); stack.push(Math.floor(stack.pop() / tmp)); }");
    1.51 +                    break;
    1.52 +                case bc_fdiv:
    1.53 +                case bc_ddiv:
    1.54 +                    out.append("{ var tmp = stack.pop(); stack.push(stack.pop() / tmp); }");
    1.55 +                    break;
    1.56                  case bc_ireturn:
    1.57                  case bc_lreturn:
    1.58                  case bc_freturn:
    1.59 @@ -149,21 +173,26 @@
    1.60                  case bc_i2f:
    1.61                  case bc_i2d:
    1.62                  case bc_l2i:
    1.63 +                    // max int check?
    1.64                  case bc_l2f:
    1.65                  case bc_l2d:
    1.66 +                case bc_f2d:
    1.67 +                case bc_d2f:
    1.68 +                    out.append("/* number conversion */");
    1.69 +                    break;
    1.70                  case bc_f2i:
    1.71                  case bc_f2l:
    1.72 -                case bc_f2d:
    1.73                  case bc_d2i:
    1.74                  case bc_d2l:
    1.75 -                case bc_d2f:
    1.76 +                    out.append("stack.push(Math.floor(stack.pop()));");
    1.77 +                    break;
    1.78                  case bc_i2b:
    1.79                  case bc_i2c:
    1.80                  case bc_i2s:
    1.81                      out.append("/* number conversion */");
    1.82                      break;
    1.83              }
    1.84 -            out.append("/*");
    1.85 +            out.append(" /*");
    1.86              for (int j = prev; j <= i; j++) {
    1.87                  out.append(" ");
    1.88                  final int cc = (byteCodes[j] + 256) % 256;
     2.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethod.java	Mon Aug 27 05:47:44 2012 +0200
     2.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethod.java	Mon Aug 27 06:12:35 2012 +0200
     2.3 @@ -31,4 +31,10 @@
     2.4      public static double minus(double x, long y) {
     2.5          return x - y;
     2.6      }
     2.7 +    public static int div(byte c, double d) {
     2.8 +        return (int)(d / c);
     2.9 +    }
    2.10 +    public static int mix(int a, long b, byte c, double d) {
    2.11 +        return (int)((b / a + c) * d);
    2.12 +    }
    2.13  }
     3.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Mon Aug 27 05:47:44 2012 +0200
     3.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Mon Aug 27 06:12:35 2012 +0200
     3.3 @@ -57,6 +57,23 @@
     3.4              3.0d, 1l
     3.5          );
     3.6      }
     3.7 +
     3.8 +    @Test public void divAndRound() throws Exception {
     3.9 +        assertExec(
    3.10 +            "Should be rounded to one",
    3.11 +            "org_apidesign_java4browser_StaticMethod_divIBD", 
    3.12 +            Double.valueOf(1),
    3.13 +            3, 3.75
    3.14 +        );
    3.15 +    }
    3.16 +    @Test public void mixedMethodFourParams() throws Exception {
    3.17 +        assertExec(
    3.18 +            "Should be two",
    3.19 +            "org_apidesign_java4browser_StaticMethod_mixIIJBD", 
    3.20 +            Double.valueOf(20),
    3.21 +            2, 10l, 5, 2.0
    3.22 +        );
    3.23 +    }
    3.24      
    3.25      private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
    3.26          StringBuilder sb = new StringBuilder();
    3.27 @@ -74,7 +91,7 @@
    3.28          if (expRes.equals(ret)) {
    3.29              return;
    3.30          }
    3.31 -        assertEquals(ret, expRes, msg + "\n" + sb);
    3.32 +        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + sb);
    3.33          
    3.34      }
    3.35