Support for static integer fields
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 16 Sep 2012 07:28:57 +0200
changeset 90cab1e07e677
parent 8 82772c96ec57
child 10 e84d9314f1bc
Support for static integer fields
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	Sat Sep 15 22:12:49 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Sun Sep 16 07:28:57 2012 +0200
     1.3 @@ -30,6 +30,7 @@
     1.4  import org.netbeans.modules.classfile.Code;
     1.5  import org.netbeans.modules.classfile.Method;
     1.6  import org.netbeans.modules.classfile.Parameter;
     1.7 +import org.netbeans.modules.classfile.Variable;
     1.8  
     1.9  /** Translator of the code inside class files to JavaScript.
    1.10   *
    1.11 @@ -58,6 +59,11 @@
    1.12                  compiler.generateStaticMethod(m);
    1.13              }
    1.14          }
    1.15 +        for (Variable v : jc.getVariables()) {
    1.16 +            if (v.isStatic()) {
    1.17 +                compiler.generateStaticField(v);
    1.18 +            }
    1.19 +        }
    1.20      }
    1.21      private void generateStaticMethod(Method m) throws IOException {
    1.22          out.append("\nfunction ").append(
    1.23 @@ -369,6 +375,22 @@
    1.24                      i += 2;
    1.25                      break;
    1.26                  }
    1.27 +                case bc_getstatic: {
    1.28 +                    int indx = readIntArg(byteCodes, i);
    1.29 +                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
    1.30 +                    out.append("stack.push(").append(fi.getClassName().getExternalName().replace('.', '_'));
    1.31 +                    out.append('_').append(fi.getFieldName()).append(");");
    1.32 +                    i += 2;
    1.33 +                    break;
    1.34 +                }
    1.35 +                case bc_putstatic: {
    1.36 +                    int indx = readIntArg(byteCodes, i);
    1.37 +                    CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
    1.38 +                    out.append(fi.getClassName().getExternalName().replace('.', '_'));
    1.39 +                    out.append('_').append(fi.getFieldName()).append(" = stack.pop();");
    1.40 +                    i += 2;
    1.41 +                    break;
    1.42 +                }
    1.43                      
    1.44              }
    1.45              out.append(" /*");
    1.46 @@ -446,4 +468,10 @@
    1.47          }
    1.48          return cnt;
    1.49      }
    1.50 +
    1.51 +    private void generateStaticField(Variable v) throws IOException {
    1.52 +        out.append("\nvar ")
    1.53 +           .append(jc.getName().getExternalName().replace('.', '_'))
    1.54 +           .append('_').append(v.getName()).append(" = 0;");
    1.55 +    }
    1.56  }
     2.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethod.java	Sat Sep 15 22:12:49 2012 +0200
     2.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethod.java	Sun Sep 16 07:28:57 2012 +0200
     2.3 @@ -22,6 +22,8 @@
     2.4   * @author Jaroslav Tulach <jtulach@netbeans.org>
     2.5   */
     2.6  public class StaticMethod {
     2.7 +    private static int cnt;
     2.8 +    
     2.9      public static int sum(int x, int y) {
    2.10          return x + y;
    2.11      }
    2.12 @@ -57,4 +59,10 @@
    2.13          }
    2.14          return res;
    2.15      }
    2.16 +    public static int inc4() {
    2.17 +        cnt++;
    2.18 +        cnt+=2;
    2.19 +        cnt++;
    2.20 +        return cnt;
    2.21 +    }
    2.22  }
     3.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Sat Sep 15 22:12:49 2012 +0200
     3.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Sun Sep 16 07:28:57 2012 +0200
     3.3 @@ -121,6 +121,13 @@
     3.4              3
     3.5          );
     3.6      }
     3.7 +    @Test public void inc4() throws Exception {
     3.8 +        assertExec(
     3.9 +            "It will be 4",
    3.10 +            "org_apidesign_java4browser_StaticMethod_inc4I",
    3.11 +            Double.valueOf(4)
    3.12 +        );
    3.13 +    }
    3.14      
    3.15      private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
    3.16          StringBuilder sb = new StringBuilder();