# HG changeset patch # User Jaroslav Tulach # Date 1353173652 -3600 # Node ID 2f0205599623aecdf1565982fcbe12f8237f4455 # Parent 9eb74b221cff9512c22d2d9d2fc91d441f8641f2 Initialize fields with 0, 0.0 and null diff -r 9eb74b221cff -r 2f0205599623 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Nov 17 17:43:15 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Nov 17 18:34:12 2012 +0100 @@ -93,7 +93,7 @@ for (FieldData v : jc.getFields()) { if (!v.isStatic()) { out.append("\n this.fld_"). - append(v.getName()).append(" = 0;"); + append(v.getName()).append(initField(v)); } } out.append("\n}\n\nfunction ").append(className).append("_proto() {"); @@ -844,7 +844,7 @@ private void generateStaticField(FieldData v) throws IOException { out.append("\nvar ") .append(className(jc)) - .append('_').append(v.getName()).append(" = 0;"); + .append('_').append(v.getName()).append(initField(v)); } private String findMethodName(MethodData m, StringBuilder cnt) { @@ -1065,4 +1065,23 @@ ap.parse(arr, cd); return found[0] ? values : null; } + + private CharSequence initField(FieldData v) { + final String is = v.getInternalSig(); + if (is.length() == 1) { + switch (is.charAt(0)) { + case 'S': + case 'J': + case 'B': + case 'Z': + case 'C': + case 'I': return " = 0;"; + case 'F': + case 'D': return " = 0.0"; + default: + throw new IllegalStateException(is); + } + } + return " = null;"; + } } diff -r 9eb74b221cff -r 2f0205599623 vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Sat Nov 17 17:43:15 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Sat Nov 17 18:34:12 2012 +0100 @@ -25,6 +25,7 @@ */ public class StaticMethod { private static int cnt; + private static Object NULL; public static int minusOne() { return -1; @@ -42,6 +43,10 @@ return toRet; } + public static boolean isNull() { + return NULL == null; + } + public static int sum(int x, int y) { return x + y; } diff -r 9eb74b221cff -r 2f0205599623 vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Sat Nov 17 17:43:15 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Sat Nov 17 18:34:12 2012 +0100 @@ -42,6 +42,14 @@ ); } + @Test public void checkReallyInitializedValues() throws Exception { + assertExec( + "Return true", + "org_apidesign_vm4brwsr_StaticMethod_isNullZ", + Double.valueOf(1) + ); + } + @Test public void powerOfThree() throws Exception { assertExec( "Should be nine", diff -r 9eb74b221cff -r 2f0205599623 vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java Sat Nov 17 17:43:15 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java Sat Nov 17 18:34:12 2012 +0100 @@ -48,6 +48,16 @@ } catch (Exception ex) { File f = File.createTempFile("execution", ".js"); FileWriter w = new FileWriter(f); + w.append("var byteCode = [\n "); + String sep = ""; + for (int i = 0; i < arr.length; i++) { + w.append(sep).append(Integer.toString((arr[i] + 256) % 256)); + sep = ", "; + if (i % 20 == 0) { + w.append("\n "); + } + } + w.append("\n];\n"); w.append(codeSeq); w.close(); throw new Exception(ex.getMessage() + " file: " + f, ex);