rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
changeset 1856 9cdc403018b5
parent 1855 34efbdde4eca
child 1857 f1344425bcb1
     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]);