Handles virtual property read Libraries
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 14 Jun 2016 05:20:30 +0200
branchLibraries
changeset 19750e230308c26f
parent 1974 a5fc49f9ef40
child 1976 9d33c9507806
Handles virtual property read
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Jun 10 08:24:36 2016 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Jun 14 05:20:30 2016 +0200
     1.3 @@ -1452,23 +1452,30 @@
     1.4                      int indx = readUShortArg(byteCodes, i);
     1.5                      String[] fi = jc.getFieldInfoName(indx);
     1.6                      final int type = VarType.fromFieldType(fi[2].charAt(0));
     1.7 -                    FieldData field = findField(fi);
     1.8 -                    if (field == null) {
     1.9 -                        final String mangleClass = mangleClassName(fi[0]);
    1.10 -                        final String mangleClassAccess = accessClassFalse(mangleClass);
    1.11 -                        smapper.replace(this, type, "@2.call(@1)",
    1.12 +                    if (DirectlLibraries.isScriptLibrary(fi[0])) {
    1.13 +                        smapper.replace(this, type, "@1['@2']",
    1.14                               smapper.getA(0),
    1.15 -                             accessField(mangleClassAccess, null, fi)
    1.16 +                             fi[1]
    1.17                          );
    1.18                      } else {
    1.19 -                        final String fieldOwner = mangleClassName(field.cls.getClassName());
    1.20 -                        smapper.replace(this, type, "@1@2",
    1.21 -                             smapper.getA(0),
    1.22 -                             accessField(fieldOwner, field, fi)
    1.23 -                        );
    1.24 +                        FieldData field = findField(fi);
    1.25 +                        if (field == null) {
    1.26 +                            final String mangleClass = mangleClassName(fi[0]);
    1.27 +                            final String mangleClassAccess = accessClassFalse(mangleClass);
    1.28 +                            smapper.replace(this, type, "@2.call(@1)",
    1.29 +                                 smapper.getA(0),
    1.30 +                                 accessField(mangleClassAccess, null, fi)
    1.31 +                            );
    1.32 +                        } else {
    1.33 +                            final String fieldOwner = mangleClassName(field.cls.getClassName());
    1.34 +                            smapper.replace(this, type, "@1@2",
    1.35 +                                 smapper.getA(0),
    1.36 +                                 accessField(fieldOwner, field, fi)
    1.37 +                            );
    1.38 +                        }
    1.39 +                        addReference(fi[0]);
    1.40                      }
    1.41                      i += 2;
    1.42 -                    addReference(fi[0]);
    1.43                      break;
    1.44                  }
    1.45                  case opc_putfield: {
    1.46 @@ -1930,6 +1937,14 @@
    1.47                      .append(';');
    1.48                  return i;
    1.49              }
    1.50 +            if (
    1.51 +                mi[0].equals("net/java/html/lib/Objs$Property") &&
    1.52 +                mi[1].equals("get")
    1.53 +            ) {
    1.54 +                // virtual get = property read
    1.55 +                append(vars[0].toString()).append(';');
    1.56 +                return i;
    1.57 +            }
    1.58              append(vars[0].toString()).append("['").append(mi[1]).append("'](");
    1.59          } else {
    1.60              append(accessVirtualMethod(vars[0].toString(), mn, mi, numArguments));