1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 25 15:44:09 2013 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Jan 26 08:47:05 2013 +0100
1.3 @@ -114,11 +114,6 @@
1.4 out.append("\n\n").append(assignClass(className));
1.5 out.append("function CLS() {");
1.6 out.append("\n if (!CLS.prototype.$instOf_").append(className).append(") {");
1.7 - for (FieldData v : jc.getFields()) {
1.8 - if (v.isStatic()) {
1.9 - out.append("\n CLS.").append(v.getName()).append(initField(v));
1.10 - }
1.11 - }
1.12 if (proto == null) {
1.13 String sc = jc.getSuperClassName(); // with _
1.14 out.append("\n var pp = ").
1.15 @@ -134,6 +129,18 @@
1.16 out.append("\n var c = ").append(proto[0]).append(";");
1.17 out.append("\n var sprcls = null;");
1.18 }
1.19 + for (FieldData v : jc.getFields()) {
1.20 + if (v.isStatic()) {
1.21 + out.append("\n CLS.").append(v.getName()).append(initField(v));
1.22 + } else {
1.23 + out.append("\n c._").append(v.getName()).append(" = function (v) {")
1.24 + .append(" if (arguments.length == 1) this.fld_").
1.25 + append(className).append('_').append(v.getName())
1.26 + .append(" = v; return this.fld_").
1.27 + append(className).append('_').append(v.getName())
1.28 + .append("; };");
1.29 + }
1.30 + }
1.31 for (MethodData m : jc.getMethods()) {
1.32 byte[] onlyArr = m.findAnnotationData(true);
1.33 String[] only = findAnnotation(onlyArr, jc,
1.34 @@ -206,6 +213,7 @@
1.35 }
1.36 if (!v.isStatic()) {
1.37 out.append("\n this.fld_").
1.38 + append(className).append('_').
1.39 append(v.getName()).append(initField(v));
1.40 }
1.41 }
1.42 @@ -1197,8 +1205,26 @@
1.43 int indx = readIntArg(byteCodes, i);
1.44 String[] fi = jc.getFieldInfoName(indx);
1.45 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.46 - emit(out, "var @2 = @1.fld_@3;",
1.47 - smapper.popA(), smapper.pushT(type), fi[1]);
1.48 + final String mangleClass = mangleSig(fi[0]);
1.49 + final String mangleClassAccess = accessClass(mangleClass);
1.50 + emit(out, "var @2 = @4(false)._@3.call(@1);",
1.51 + smapper.popA(),
1.52 + smapper.pushT(type), fi[1], mangleClassAccess
1.53 + );
1.54 + i += 2;
1.55 + break;
1.56 + }
1.57 + case opc_putfield: {
1.58 + int indx = readIntArg(byteCodes, i);
1.59 + String[] fi = jc.getFieldInfoName(indx);
1.60 + final int type = VarType.fromFieldType(fi[2].charAt(0));
1.61 + final String mangleClass = mangleSig(fi[0]);
1.62 + final String mangleClassAccess = accessClass(mangleClass);
1.63 + emit(out, "@4(false)._@3.call(@2, @1);",
1.64 + smapper.popT(type),
1.65 + smapper.popA(), fi[1],
1.66 + mangleClassAccess
1.67 + );
1.68 i += 2;
1.69 break;
1.70 }
1.71 @@ -1213,15 +1239,6 @@
1.72 addReference(fi[0]);
1.73 break;
1.74 }
1.75 - case opc_putfield: {
1.76 - int indx = readIntArg(byteCodes, i);
1.77 - String[] fi = jc.getFieldInfoName(indx);
1.78 - final int type = VarType.fromFieldType(fi[2].charAt(0));
1.79 - emit(out, "@2.fld_@3 = @1;",
1.80 - smapper.popT(type), smapper.popA(), fi[1]);
1.81 - i += 2;
1.82 - break;
1.83 - }
1.84 case opc_putstatic: {
1.85 int indx = readIntArg(byteCodes, i);
1.86 String[] fi = jc.getFieldInfoName(indx);
1.87 @@ -1420,6 +1437,10 @@
1.88 }
1.89 }
1.90
1.91 + static String mangleSig(String sig) {
1.92 + return mangleSig(sig, 0, sig.length());
1.93 + }
1.94 +
1.95 private static String mangleSig(String txt, int first, int last) {
1.96 StringBuilder sb = new StringBuilder();
1.97 for (int i = first; i < last; i++) {