Conditional statement and and or
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 27 Aug 2012 15:16:39 +0200
changeset 75b135a2f2de3
parent 6 6e4682985907
child 8 82772c96ec57
Conditional statement and and or
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 14:36:48 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Mon Aug 27 15:16:39 2012 +0200
     1.3 @@ -187,6 +187,14 @@
     1.4                  case bc_ddiv:
     1.5                      out.append("{ var tmp = stack.pop(); stack.push(stack.pop() / tmp); }");
     1.6                      break;
     1.7 +                case bc_iand:
     1.8 +                case bc_land:
     1.9 +                    out.append("stack.push(stack.pop() & stack.pop());");
    1.10 +                    break;
    1.11 +                case bc_ior:
    1.12 +                case bc_lor:
    1.13 +                    out.append("stack.push(stack.pop() | stack.pop());");
    1.14 +                    break;
    1.15                  case bc_ixor:
    1.16                  case bc_lxor:
    1.17                      out.append("stack.push(stack.pop() ^ stack.pop());");
    1.18 @@ -258,6 +266,13 @@
    1.19                      i = generateIf(byteCodes, i, "==");
    1.20                      break;
    1.21                  }
    1.22 +                case bc_ifeq: {
    1.23 +                    int indx = i + readIntArg(byteCodes, i);
    1.24 +                    out.append("if (stack.pop() == 0) { gt = " + indx);
    1.25 +                    out.append("; continue; }");
    1.26 +                    i += 2;
    1.27 +                    break;
    1.28 +                }
    1.29                  case bc_if_icmpne:
    1.30                      i = generateIf(byteCodes, i, "!=");
    1.31                      break;
     2.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethod.java	Mon Aug 27 14:36:48 2012 +0200
     2.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethod.java	Mon Aug 27 15:16:39 2012 +0200
     2.3 @@ -40,6 +40,9 @@
     2.4      public static long xor(int a, long b) {
     2.5          return a ^ b;
     2.6      }
     2.7 +    public static long orOrAnd(boolean doOr, int a, int b) {
     2.8 +        return doOr ? a | b : a & b;
     2.9 +    }
    2.10      public static long factRec(int n) {
    2.11          if (n <= 1) {
    2.12              return 1;
     3.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Mon Aug 27 14:36:48 2012 +0200
     3.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Mon Aug 27 15:16:39 2012 +0200
     3.3 @@ -101,6 +101,27 @@
     3.4          );
     3.5      }
     3.6      
     3.7 +    @Test public void or() throws Exception {
     3.8 +        assertExec(
     3.9 +            "Or will be 7",
    3.10 +            "org_apidesign_java4browser_StaticMethod_orOrAndJZII",
    3.11 +            Double.valueOf(7),
    3.12 +            true,
    3.13 +            4,
    3.14 +            3
    3.15 +        );
    3.16 +    }
    3.17 +    @Test public void and() throws Exception {
    3.18 +        assertExec(
    3.19 +            "And will be 3",
    3.20 +            "org_apidesign_java4browser_StaticMethod_orOrAndJZII",
    3.21 +            Double.valueOf(3),
    3.22 +            false,
    3.23 +            7,
    3.24 +            3
    3.25 +        );
    3.26 +    }
    3.27 +    
    3.28      private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
    3.29          StringBuilder sb = new StringBuilder();
    3.30          Invocable i = compileClass("StaticMethod.class", sb);