diff -r a7a45e5e5e77 -r 5e13b1ac2886 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 25 15:44:09 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Jan 26 08:47:05 2013 +0100 @@ -114,11 +114,6 @@ out.append("\n\n").append(assignClass(className)); out.append("function CLS() {"); out.append("\n if (!CLS.prototype.$instOf_").append(className).append(") {"); - for (FieldData v : jc.getFields()) { - if (v.isStatic()) { - out.append("\n CLS.").append(v.getName()).append(initField(v)); - } - } if (proto == null) { String sc = jc.getSuperClassName(); // with _ out.append("\n var pp = "). @@ -134,6 +129,18 @@ out.append("\n var c = ").append(proto[0]).append(";"); out.append("\n var sprcls = null;"); } + for (FieldData v : jc.getFields()) { + if (v.isStatic()) { + out.append("\n CLS.").append(v.getName()).append(initField(v)); + } else { + out.append("\n c._").append(v.getName()).append(" = function (v) {") + .append(" if (arguments.length == 1) this.fld_"). + append(className).append('_').append(v.getName()) + .append(" = v; return this.fld_"). + append(className).append('_').append(v.getName()) + .append("; };"); + } + } for (MethodData m : jc.getMethods()) { byte[] onlyArr = m.findAnnotationData(true); String[] only = findAnnotation(onlyArr, jc, @@ -206,6 +213,7 @@ } if (!v.isStatic()) { out.append("\n this.fld_"). + append(className).append('_'). append(v.getName()).append(initField(v)); } } @@ -1197,8 +1205,26 @@ int indx = readIntArg(byteCodes, i); String[] fi = jc.getFieldInfoName(indx); final int type = VarType.fromFieldType(fi[2].charAt(0)); - emit(out, "var @2 = @1.fld_@3;", - smapper.popA(), smapper.pushT(type), fi[1]); + final String mangleClass = mangleSig(fi[0]); + final String mangleClassAccess = accessClass(mangleClass); + emit(out, "var @2 = @4(false)._@3.call(@1);", + smapper.popA(), + smapper.pushT(type), fi[1], mangleClassAccess + ); + i += 2; + break; + } + case opc_putfield: { + int indx = readIntArg(byteCodes, i); + String[] fi = jc.getFieldInfoName(indx); + final int type = VarType.fromFieldType(fi[2].charAt(0)); + final String mangleClass = mangleSig(fi[0]); + final String mangleClassAccess = accessClass(mangleClass); + emit(out, "@4(false)._@3.call(@2, @1);", + smapper.popT(type), + smapper.popA(), fi[1], + mangleClassAccess + ); i += 2; break; } @@ -1213,15 +1239,6 @@ addReference(fi[0]); break; } - case opc_putfield: { - int indx = readIntArg(byteCodes, i); - String[] fi = jc.getFieldInfoName(indx); - final int type = VarType.fromFieldType(fi[2].charAt(0)); - emit(out, "@2.fld_@3 = @1;", - smapper.popT(type), smapper.popA(), fi[1]); - i += 2; - break; - } case opc_putstatic: { int indx = readIntArg(byteCodes, i); String[] fi = jc.getFieldInfoName(indx); @@ -1420,6 +1437,10 @@ } } + static String mangleSig(String sig) { + return mangleSig(sig, 0, sig.length()); + } + private static String mangleSig(String txt, int first, int last) { StringBuilder sb = new StringBuilder(); for (int i = first; i < last; i++) {