Using floor when converting from double, float to int, long. Support for more than four parameters
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