Few more instructions required to load transitive closure of java/lang/Object
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 21 Sep 2012 10:14:25 +0200
changeset 200e7dd9e2e31e
parent 19 2291e553464a
child 21 d8807b6a636a
Few more instructions required to load transitive closure of java/lang/Object
src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java
src/test/java/org/apidesign/java4browser/StaticMethodTest.java
     1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Thu Sep 20 14:35:21 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Fri Sep 21 10:14:25 2012 +0200
     1.3 @@ -360,6 +360,12 @@
     1.4                  case bc_iconst_5:
     1.5                      out.append("stack.push(5);");
     1.6                      break;
     1.7 +                case bc_ldc: {
     1.8 +                    int indx = byteCodes[i++];
     1.9 +                    CPEntry entry = jc.getConstantPool().get(indx);
    1.10 +                    out.append("stack.push(" + entry.getValue() + ");");
    1.11 +                    break;
    1.12 +                }
    1.13                  case bc_ldc_w:
    1.14                  case bc_ldc2_w: {
    1.15                      int indx = readIntArg(byteCodes, i);
    1.16 @@ -368,6 +374,14 @@
    1.17                      out.append("stack.push(" + entry.getValue() + ");");
    1.18                      break;
    1.19                  }
    1.20 +                case bc_lcmp:
    1.21 +                case bc_fcmpl:
    1.22 +                case bc_fcmpg:
    1.23 +                case bc_dcmpl:
    1.24 +                case bc_dcmpg: {
    1.25 +                    out.append("{ var delta = stack.pop() - stack.pop(); stack.push(delta < 0 ?-1 : (delta == 0 ? 0 : 1)); }");
    1.26 +                    break;
    1.27 +                }
    1.28                  case bc_if_icmpeq: {
    1.29                      i = generateIf(byteCodes, i, "==");
    1.30                      break;
    1.31 @@ -379,6 +393,41 @@
    1.32                      i += 2;
    1.33                      break;
    1.34                  }
    1.35 +                case bc_ifne: {
    1.36 +                    int indx = i + readIntArg(byteCodes, i);
    1.37 +                    out.append("if (stack.pop() != 0) { gt = " + indx);
    1.38 +                    out.append("; continue; }");
    1.39 +                    i += 2;
    1.40 +                    break;
    1.41 +                }
    1.42 +                case bc_iflt: {
    1.43 +                    int indx = i + readIntArg(byteCodes, i);
    1.44 +                    out.append("if (stack.pop() < 0) { gt = " + indx);
    1.45 +                    out.append("; continue; }");
    1.46 +                    i += 2;
    1.47 +                    break;
    1.48 +                }
    1.49 +                case bc_ifle: {
    1.50 +                    int indx = i + readIntArg(byteCodes, i);
    1.51 +                    out.append("if (stack.pop() <= 0) { gt = " + indx);
    1.52 +                    out.append("; continue; }");
    1.53 +                    i += 2;
    1.54 +                    break;
    1.55 +                }
    1.56 +                case bc_ifgt: {
    1.57 +                    int indx = i + readIntArg(byteCodes, i);
    1.58 +                    out.append("if (stack.pop() > 0) { gt = " + indx);
    1.59 +                    out.append("; continue; }");
    1.60 +                    i += 2;
    1.61 +                    break;
    1.62 +                }
    1.63 +                case bc_ifge: {
    1.64 +                    int indx = i + readIntArg(byteCodes, i);
    1.65 +                    out.append("if (stack.pop() >= 0) { gt = " + indx);
    1.66 +                    out.append("; continue; }");
    1.67 +                    i += 2;
    1.68 +                    break;
    1.69 +                }
    1.70                  case bc_ifnonnull: {
    1.71                      int indx = i + readIntArg(byteCodes, i);
    1.72                      out.append("if (stack.pop()) { gt = " + indx);
     2.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Thu Sep 20 14:35:21 2012 +0200
     2.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Fri Sep 21 10:14:25 2012 +0200
     2.3 @@ -176,7 +176,16 @@
     2.4              }
     2.5              InputStream is = StaticMethodTest.class.getClassLoader().getResourceAsStream(name + ".class");
     2.6              assertNotNull(is, "Class file found");
     2.7 -            ByteCodeToJavaScript.compile(is, sb, toProcess);
     2.8 +            try {
     2.9 +                ByteCodeToJavaScript.compile(is, sb, toProcess);
    2.10 +            } catch (RuntimeException ex) {
    2.11 +                int lastBlock = sb.lastIndexOf("{");
    2.12 +                throw new IllegalStateException(
    2.13 +                    "Error while compiling " + name + "\n" + 
    2.14 +                    sb.substring(lastBlock + 1, sb.length()), 
    2.15 +                    ex
    2.16 +                );
    2.17 +            }
    2.18          }
    2.19          ScriptEngineManager sem = new ScriptEngineManager();
    2.20          ScriptEngine js = sem.getEngineByExtension("js");