# HG changeset patch # User Jaroslav Tulach # Date 1347739969 -7200 # Node ID 82772c96ec57dfc5c1b3e7fee4edf3292695ef37 # Parent 5b135a2f2de36bbdf31deeed85e6b3e1b8323bff Few more instructions, but not all of them are well implemented diff -r 5b135a2f2de3 -r 82772c96ec57 src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Mon Aug 27 15:16:39 2012 +0200 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Sat Sep 15 22:12:49 2012 +0200 @@ -21,6 +21,10 @@ import java.io.InputStream; import java.util.List; import static org.netbeans.modules.classfile.ByteCodes.*; +import org.netbeans.modules.classfile.CPClassInfo; +import org.netbeans.modules.classfile.CPEntry; +import org.netbeans.modules.classfile.CPFieldInfo; +import org.netbeans.modules.classfile.CPLongInfo; import org.netbeans.modules.classfile.CPMethodInfo; import org.netbeans.modules.classfile.ClassFile; import org.netbeans.modules.classfile.Code; @@ -137,24 +141,28 @@ out.append("stack.push(arg").append(indx + ");"); break; } + case bc_astore_0: case bc_istore_0: case bc_lstore_0: case bc_fstore_0: case bc_dstore_0: out.append("arg0 = stack.pop();"); break; + case bc_astore_1: case bc_istore_1: case bc_lstore_1: case bc_fstore_1: case bc_dstore_1: out.append("arg1 = stack.pop();"); break; + case bc_astore_2: case bc_istore_2: case bc_lstore_2: case bc_fstore_2: case bc_dstore_2: out.append("arg2 = stack.pop();"); break; + case bc_astore_3: case bc_istore_3: case bc_lstore_3: case bc_fstore_3: @@ -262,6 +270,14 @@ case bc_iconst_5: out.append("stack.push(5);"); break; + case bc_ldc_w: + case bc_ldc2_w: { + int indx = readIntArg(byteCodes, i); + CPEntry entry = jc.getConstantPool().get(indx); + i += 2; + out.append("stack.push(" + entry.getValue() + ");"); + break; + } case bc_if_icmpeq: { i = generateIf(byteCodes, i, "=="); break; @@ -323,6 +339,37 @@ i += 2; break; } + case bc_new: { + int indx = readIntArg(byteCodes, i); + CPClassInfo ci = jc.getConstantPool().getClass(indx); + out.append("stack.push("); + out.append("new ").append(ci.getClassName().getExternalName().replace('.','_')); + out.append("());"); + i += 2; + break; + } + case bc_dup: + out.append("stack.push(stack[stack.length - 1]);"); + break; + case bc_bipush: + out.append("stack.push(" + byteCodes[++i] + ");"); + break; + case bc_invokevirtual: + case bc_invokespecial: { + int indx = readIntArg(byteCodes, i); + CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(indx); + out.append("{ var tmp = stack.pop(); tmp." + mi.getMethodName() + "(); }"); + i += 2; + break; + } + case bc_getfield: { + int indx = readIntArg(byteCodes, i); + CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx); + out.append(" stack.push(stack.pop().").append(fi.getFieldName()).append(");"); + i += 2; + break; + } + } out.append(" /*"); for (int j = prev; j <= i; j++) { diff -r 5b135a2f2de3 -r 82772c96ec57 src/test/java/org/apidesign/java4browser/Instance.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/org/apidesign/java4browser/Instance.java Sat Sep 15 22:12:49 2012 +0200 @@ -0,0 +1,37 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.apidesign.java4browser; + +/** + * + * @author Jaroslav Tulach + */ +public class Instance { + private int i; + protected short s; + public double d; + private float f; + protected byte b = (byte)131; + + public Instance(int i, double d) { + this.i = i; + this.d = d; + } + + public byte getByte() { + return b; + } + + public void setByte(byte b) { + this.b = b; + } + + public static double magicOne() { + Instance i = new Instance(10, 3.3d); + i.setByte((byte)0x09); + + return (i.i - i.getByte()) * i.d; + } +} diff -r 5b135a2f2de3 -r 82772c96ec57 src/test/java/org/apidesign/java4browser/InstanceTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/org/apidesign/java4browser/InstanceTest.java Sat Sep 15 22:12:49 2012 +0200 @@ -0,0 +1,47 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.apidesign.java4browser; + +import javax.script.Invocable; +import javax.script.ScriptException; +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +/** + * + * @author Jaroslav Tulach + */ +public class InstanceTest { + @Test public void verifyMagicOne() throws Exception { + assertExec( + "Should be seven", + "org_apidesign_java4browser_Instance_magicOneD", + Double.valueOf(3.3) + ); + } + + private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { + StringBuilder sb = new StringBuilder(); + Invocable i = StaticMethodTest.compileClass("Instance.class", sb); + + Object ret = null; + try { + ret = i.invokeFunction(methodName, args); + } catch (ScriptException ex) { + fail("Execution failed in " + sb, ex); + } catch (NoSuchMethodException ex) { + fail("Cannot find method in " + sb, ex); + } + if (ret == null && expRes == null) { + return; + } + if (expRes.equals(ret)) { + return; + } + assertEquals(ret, expRes, msg + "was: " + ret + "\n" + sb); + + } + +}