1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 25 05:14:25 2016 +0100
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 25 05:53:21 2016 +0100
1.3 @@ -103,7 +103,11 @@
1.4 return "(refs_" + classOperation + " || (refs_" + classOperation + " = " + accessClass(classOperation) + "(false)))";
1.5 }
1.6
1.7 - protected String accessField(String object, String[] fieldInfoName)
1.8 + protected FieldData findField(String[] fieldInfoName) throws IOException {
1.9 + return null;
1.10 + }
1.11 +
1.12 + protected String accessField(String object, FieldData data, String[] fieldInfoName)
1.13 throws IOException {
1.14 String mangledName = "_" + fieldInfoName[1];
1.15 return object + "." + mangledName;
1.16 @@ -1419,12 +1423,21 @@
1.17 int indx = readUShortArg(byteCodes, i);
1.18 String[] fi = jc.getFieldInfoName(indx);
1.19 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.20 - final String mangleClass = mangleClassName(fi[0]);
1.21 - final String mangleClassAccess = accessClassFalse(mangleClass);
1.22 - smapper.replace(this, type, "@2.call(@1)",
1.23 - smapper.getA(0),
1.24 - accessField(mangleClassAccess, fi)
1.25 - );
1.26 + FieldData field = findField(fi);
1.27 + if (field == null) {
1.28 + final String mangleClass = mangleClassName(fi[0]);
1.29 + final String mangleClassAccess = accessClassFalse(mangleClass);
1.30 + smapper.replace(this, type, "@2.call(@1)",
1.31 + smapper.getA(0),
1.32 + accessField(mangleClassAccess, null, fi)
1.33 + );
1.34 + } else {
1.35 + final String fieldOwner = mangleClassName(field.cls.getClassName());
1.36 + smapper.replace(this, type, "@1.@2",
1.37 + smapper.getA(0),
1.38 + accessField(fieldOwner, field, fi)
1.39 + );
1.40 + }
1.41 i += 2;
1.42 addReference(fi[0]);
1.43 break;
1.44 @@ -1433,12 +1446,23 @@
1.45 int indx = readUShortArg(byteCodes, i);
1.46 String[] fi = jc.getFieldInfoName(indx);
1.47 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.48 - final String mangleClass = mangleClassName(fi[0]);
1.49 - final String mangleClassAccess = accessClassFalse(mangleClass);
1.50 - emit(smapper, this, "@3.call(@2, @1);",
1.51 - smapper.popT(type),
1.52 - smapper.popA(),
1.53 - accessField(mangleClassAccess, fi));
1.54 + FieldData field = findField(fi);
1.55 + if (field == null) {
1.56 + final String mangleClass = mangleClassName(fi[0]);
1.57 + final String mangleClassAccess = accessClassFalse(mangleClass);
1.58 + emit(smapper, this, "@3.call(@2, @1);",
1.59 + smapper.popT(type),
1.60 + smapper.popA(),
1.61 + accessField(mangleClassAccess, null, fi)
1.62 + );
1.63 + } else {
1.64 + final String fieldOwner = mangleClassName(field.cls.getClassName());
1.65 + emit(smapper, this, "@2.@3 = @1;",
1.66 + smapper.popT(type),
1.67 + smapper.popA(),
1.68 + accessField(fieldOwner, field, fi)
1.69 + );
1.70 + }
1.71 i += 2;
1.72 addReference(fi[0]);
1.73 break;
1.74 @@ -1448,7 +1472,7 @@
1.75 String[] fi = jc.getFieldInfoName(indx);
1.76 final int type = VarType.fromFieldType(fi[2].charAt(0));
1.77 String ac = accessClassFalse(mangleClassName(fi[0]));
1.78 - String af = accessField(ac, fi);
1.79 + String af = accessField(ac, null, fi);
1.80 smapper.assign(this, type, af + "()");
1.81 i += 2;
1.82 addReference(fi[0]);