# HG changeset patch # User Jaroslav Tulach # Date 1348215265 -7200 # Node ID 0e7dd9e2e31e57ccb284cc0ce93a6b92c6865920 # Parent 2291e553464a05766659ac3482e894b82aba364a Few more instructions required to load transitive closure of java/lang/Object diff -r 2291e553464a -r 0e7dd9e2e31e src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Thu Sep 20 14:35:21 2012 +0200 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Fri Sep 21 10:14:25 2012 +0200 @@ -360,6 +360,12 @@ case bc_iconst_5: out.append("stack.push(5);"); break; + case bc_ldc: { + int indx = byteCodes[i++]; + CPEntry entry = jc.getConstantPool().get(indx); + out.append("stack.push(" + entry.getValue() + ");"); + break; + } case bc_ldc_w: case bc_ldc2_w: { int indx = readIntArg(byteCodes, i); @@ -368,6 +374,14 @@ out.append("stack.push(" + entry.getValue() + ");"); break; } + case bc_lcmp: + case bc_fcmpl: + case bc_fcmpg: + case bc_dcmpl: + case bc_dcmpg: { + out.append("{ var delta = stack.pop() - stack.pop(); stack.push(delta < 0 ?-1 : (delta == 0 ? 0 : 1)); }"); + break; + } case bc_if_icmpeq: { i = generateIf(byteCodes, i, "=="); break; @@ -379,6 +393,41 @@ i += 2; break; } + case bc_ifne: { + int indx = i + readIntArg(byteCodes, i); + out.append("if (stack.pop() != 0) { gt = " + indx); + out.append("; continue; }"); + i += 2; + break; + } + case bc_iflt: { + int indx = i + readIntArg(byteCodes, i); + out.append("if (stack.pop() < 0) { gt = " + indx); + out.append("; continue; }"); + i += 2; + break; + } + case bc_ifle: { + int indx = i + readIntArg(byteCodes, i); + out.append("if (stack.pop() <= 0) { gt = " + indx); + out.append("; continue; }"); + i += 2; + break; + } + case bc_ifgt: { + int indx = i + readIntArg(byteCodes, i); + out.append("if (stack.pop() > 0) { gt = " + indx); + out.append("; continue; }"); + i += 2; + break; + } + case bc_ifge: { + int indx = i + readIntArg(byteCodes, i); + out.append("if (stack.pop() >= 0) { gt = " + indx); + out.append("; continue; }"); + i += 2; + break; + } case bc_ifnonnull: { int indx = i + readIntArg(byteCodes, i); out.append("if (stack.pop()) { gt = " + indx); diff -r 2291e553464a -r 0e7dd9e2e31e src/test/java/org/apidesign/java4browser/StaticMethodTest.java --- a/src/test/java/org/apidesign/java4browser/StaticMethodTest.java Thu Sep 20 14:35:21 2012 +0200 +++ b/src/test/java/org/apidesign/java4browser/StaticMethodTest.java Fri Sep 21 10:14:25 2012 +0200 @@ -176,7 +176,16 @@ } InputStream is = StaticMethodTest.class.getClassLoader().getResourceAsStream(name + ".class"); assertNotNull(is, "Class file found"); - ByteCodeToJavaScript.compile(is, sb, toProcess); + try { + ByteCodeToJavaScript.compile(is, sb, toProcess); + } catch (RuntimeException ex) { + int lastBlock = sb.lastIndexOf("{"); + throw new IllegalStateException( + "Error while compiling " + name + "\n" + + sb.substring(lastBlock + 1, sb.length()), + ex + ); + } } ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine js = sem.getEngineByExtension("js");