Few more instructions, but not all of them are well implemented
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 15 Sep 2012 22:12:49 +0200
changeset 882772c96ec57
parent 7 5b135a2f2de3
child 9 0cab1e07e677
Few more instructions, but not all of them are well implemented
src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java
src/test/java/org/apidesign/java4browser/Instance.java
src/test/java/org/apidesign/java4browser/InstanceTest.java
     1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Mon Aug 27 15:16:39 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Sat Sep 15 22:12:49 2012 +0200
     1.3 @@ -21,6 +21,10 @@
     1.4  import java.io.InputStream;
     1.5  import java.util.List;
     1.6  import static org.netbeans.modules.classfile.ByteCodes.*;
     1.7 +import org.netbeans.modules.classfile.CPClassInfo;
     1.8 +import org.netbeans.modules.classfile.CPEntry;
     1.9 +import org.netbeans.modules.classfile.CPFieldInfo;
    1.10 +import org.netbeans.modules.classfile.CPLongInfo;
    1.11  import org.netbeans.modules.classfile.CPMethodInfo;
    1.12  import org.netbeans.modules.classfile.ClassFile;
    1.13  import org.netbeans.modules.classfile.Code;
    1.14 @@ -137,24 +141,28 @@
    1.15                      out.append("stack.push(arg").append(indx + ");");
    1.16                      break;
    1.17                  }
    1.18 +                case bc_astore_0:
    1.19                  case bc_istore_0:
    1.20                  case bc_lstore_0:
    1.21                  case bc_fstore_0:
    1.22                  case bc_dstore_0:
    1.23                      out.append("arg0 = stack.pop();");
    1.24                      break;
    1.25 +                case bc_astore_1:
    1.26                  case bc_istore_1:
    1.27                  case bc_lstore_1:
    1.28                  case bc_fstore_1:
    1.29                  case bc_dstore_1:
    1.30                      out.append("arg1 = stack.pop();");
    1.31                      break;
    1.32 +                case bc_astore_2:
    1.33                  case bc_istore_2:
    1.34                  case bc_lstore_2:
    1.35                  case bc_fstore_2:
    1.36                  case bc_dstore_2:
    1.37                      out.append("arg2 = stack.pop();");
    1.38                      break;
    1.39 +                case bc_astore_3:
    1.40                  case bc_istore_3:
    1.41                  case bc_lstore_3:
    1.42                  case bc_fstore_3:
    1.43 @@ -262,6 +270,14 @@
    1.44                  case bc_iconst_5:
    1.45                      out.append("stack.push(5);");
    1.46                      break;
    1.47 +                case bc_ldc_w:
    1.48 +                case bc_ldc2_w: {
    1.49 +                    int indx = readIntArg(byteCodes, i);
    1.50 +                    CPEntry entry = jc.getConstantPool().get(indx);
    1.51 +                    i += 2;
    1.52 +                    out.append("stack.push(" + entry.getValue() + ");");
    1.53 +                    break;
    1.54 +                }
    1.55                  case bc_if_icmpeq: {
    1.56                      i = generateIf(byteCodes, i, "==");
    1.57                      break;
    1.58 @@ -323,6 +339,37 @@
    1.59                      i += 2;
    1.60                      break;
    1.61                  }
    1.62 +                case bc_new: {
    1.63 +                    int indx = readIntArg(byteCodes, i);
    1.64 +                    CPClassInfo ci = jc.getConstantPool().getClass(indx);
    1.65 +                    out.append("stack.push(");
    1.66 +                    out.append("new ").append(ci.getClassName().getExternalName().replace('.','_'));
    1.67 +                    out.append("());");
    1.68 +                    i += 2;
    1.69 +                    break;
    1.70 +                }
    1.71 +                case bc_dup:
    1.72 +                    out.append("stack.push(stack[stack.length - 1]);");
    1.73 +                    break;
    1.74 +                case bc_bipush:
    1.75 +                    out.append("stack.push(" + byteCodes[++i] + ");");
    1.76 +                    break;
    1.77 +                case bc_invokevirtual:
    1.78 +                case bc_invokespecial: {
    1.79 +                    int indx = readIntArg(byteCodes, i);
    1.80 +                    CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(indx);
    1.81 +                    out.append("{ var tmp = stack.pop(); tmp." + mi.getMethodName() + "(); }");
    1.82 +                    i += 2;
    1.83 +                    break;
    1.84 +                }
    1.85 +                case bc_getfield: {
    1.86 +                    int indx = readIntArg(byteCodes, i);
    1.87 +                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
    1.88 +                    out.append(" stack.push(stack.pop().").append(fi.getFieldName()).append(");");
    1.89 +                    i += 2;
    1.90 +                    break;
    1.91 +                }
    1.92 +                    
    1.93              }
    1.94              out.append(" /*");
    1.95              for (int j = prev; j <= i; j++) {
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/src/test/java/org/apidesign/java4browser/Instance.java	Sat Sep 15 22:12:49 2012 +0200
     2.3 @@ -0,0 +1,37 @@
     2.4 +/*
     2.5 + * To change this template, choose Tools | Templates
     2.6 + * and open the template in the editor.
     2.7 + */
     2.8 +package org.apidesign.java4browser;
     2.9 +
    2.10 +/**
    2.11 + *
    2.12 + * @author Jaroslav Tulach <jtulach@netbeans.org>
    2.13 + */
    2.14 +public class Instance {
    2.15 +    private int i;
    2.16 +    protected short s;
    2.17 +    public double d;
    2.18 +    private float f;
    2.19 +    protected byte b = (byte)131;
    2.20 +
    2.21 +    public Instance(int i, double d) {
    2.22 +        this.i = i;
    2.23 +        this.d = d;
    2.24 +    }
    2.25 +    
    2.26 +    public byte getByte() {
    2.27 +        return b;
    2.28 +    }
    2.29 +    
    2.30 +    public void setByte(byte b) {
    2.31 +        this.b = b;
    2.32 +    }
    2.33 +    
    2.34 +    public static double magicOne() {
    2.35 +        Instance i = new Instance(10, 3.3d);
    2.36 +        i.setByte((byte)0x09);
    2.37 +        
    2.38 +        return (i.i - i.getByte()) * i.d;
    2.39 +    }
    2.40 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/src/test/java/org/apidesign/java4browser/InstanceTest.java	Sat Sep 15 22:12:49 2012 +0200
     3.3 @@ -0,0 +1,47 @@
     3.4 +/*
     3.5 + * To change this template, choose Tools | Templates
     3.6 + * and open the template in the editor.
     3.7 + */
     3.8 +package org.apidesign.java4browser;
     3.9 +
    3.10 +import javax.script.Invocable;
    3.11 +import javax.script.ScriptException;
    3.12 +import org.testng.annotations.Test;
    3.13 +import static org.testng.Assert.*;
    3.14 +
    3.15 +/**
    3.16 + *
    3.17 + * @author Jaroslav Tulach <jtulach@netbeans.org>
    3.18 + */
    3.19 +public class InstanceTest {
    3.20 +    @Test public void verifyMagicOne() throws Exception {
    3.21 +        assertExec(
    3.22 +            "Should be seven",
    3.23 +            "org_apidesign_java4browser_Instance_magicOneD",
    3.24 +            Double.valueOf(3.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 = StaticMethodTest.compileClass("Instance.class", sb);
    3.31 +        
    3.32 +        Object ret = null;
    3.33 +        try {
    3.34 +            ret = i.invokeFunction(methodName, args);
    3.35 +        } catch (ScriptException ex) {
    3.36 +            fail("Execution failed in " + sb, ex);
    3.37 +        } catch (NoSuchMethodException ex) {
    3.38 +            fail("Cannot find method in " + sb, ex);
    3.39 +        }
    3.40 +        if (ret == null && expRes == null) {
    3.41 +            return;
    3.42 +        }
    3.43 +        if (expRes.equals(ret)) {
    3.44 +            return;
    3.45 +        }
    3.46 +        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + sb);
    3.47 +        
    3.48 +    }
    3.49 +    
    3.50 +}