rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchclosure
changeset 1084 f5c9934a252c
parent 1083 9d6130cb464f
child 1085 6a4ef883e233
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon May 06 11:57:29 2013 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon May 06 18:06:08 2013 +0200
     1.3 @@ -59,6 +59,11 @@
     1.4          return classOperation;
     1.5      }
     1.6  
     1.7 +    protected String accessMember(String object, String mangledName,
     1.8 +                                  String[] fieldInfoName) throws IOException {
     1.9 +        return object + "." + mangledName;
    1.10 +    }
    1.11 +
    1.12      protected void declaredClass(ClassData classData, String mangledName)
    1.13              throws IOException {
    1.14      }
    1.15 @@ -94,7 +99,11 @@
    1.16       */
    1.17      
    1.18      public String compile(InputStream classFile) throws IOException {
    1.19 -        this.jc = new ClassData(classFile);
    1.20 +        return compile(new ClassData(classFile));
    1.21 +    }
    1.22 +
    1.23 +    protected String compile(ClassData classData) throws IOException {
    1.24 +        this.jc = classData;
    1.25          if (jc.getMajor_version() < 50) {
    1.26              throw new IOException("Can't compile " + jc.getClassName() + ". Class file version " + jc.getMajor_version() + "."
    1.27                  + jc.getMinor_version() + " - recompile with -target 1.6 (at least)."
    1.28 @@ -1195,10 +1204,11 @@
    1.29                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.30                      final String mangleClass = mangleSig(fi[0]);
    1.31                      final String mangleClassAccess = accessClass(mangleClass);
    1.32 -                    emit(out, "var @2 = @4(false)._@3.call(@1);",
    1.33 +                    emit(out, "var @2 = @3.call(@1);",
    1.34                           smapper.popA(),
    1.35 -                         smapper.pushT(type), fi[1], mangleClassAccess
    1.36 -                    );
    1.37 +                         smapper.pushT(type),
    1.38 +                         accessMember(mangleClassAccess + "(false)",
    1.39 +                                      "_" + fi[1], fi));
    1.40                      i += 2;
    1.41                      break;
    1.42                  }
    1.43 @@ -1208,11 +1218,11 @@
    1.44                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.45                      final String mangleClass = mangleSig(fi[0]);
    1.46                      final String mangleClassAccess = accessClass(mangleClass);
    1.47 -                    emit(out, "@4(false)._@3.call(@2, @1);",
    1.48 +                    emit(out, "@3.call(@2, @1);",
    1.49                           smapper.popT(type),
    1.50 -                         smapper.popA(), fi[1], 
    1.51 -                         mangleClassAccess
    1.52 -                    );
    1.53 +                         smapper.popA(),
    1.54 +                         accessMember(mangleClassAccess + "(false)",
    1.55 +                                      "_" + fi[1], fi));
    1.56                      i += 2;
    1.57                      break;
    1.58                  }
    1.59 @@ -1220,9 +1230,11 @@
    1.60                      int indx = readUShortArg(byteCodes, i);
    1.61                      String[] fi = jc.getFieldInfoName(indx);
    1.62                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.63 -                    emit(out, "var @1 = @2(false)._@3();",
    1.64 +                    emit(out, "var @1 = @2();",
    1.65                           smapper.pushT(type),
    1.66 -                         accessClass(fi[0].replace('/', '_')), fi[1]);
    1.67 +                         accessMember(accessClass(fi[0].replace('/', '_'))
    1.68 +                                          + "(false)",
    1.69 +                                      "_" + fi[1], fi));
    1.70                      i += 2;
    1.71                      addReference(fi[0]);
    1.72                      break;
    1.73 @@ -1231,8 +1243,10 @@
    1.74                      int indx = readUShortArg(byteCodes, i);
    1.75                      String[] fi = jc.getFieldInfoName(indx);
    1.76                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.77 -                    emit(out, "@1(false)._@2(@3);",
    1.78 -                         accessClass(fi[0].replace('/', '_')), fi[1],
    1.79 +                    emit(out, "@1(@2);",
    1.80 +                         accessMember(accessClass(fi[0].replace('/', '_'))
    1.81 +                                          + "(false)",
    1.82 +                                      "_" + fi[1], fi),
    1.83                           smapper.popT(type));
    1.84                      i += 2;
    1.85                      addReference(fi[0]);
    1.86 @@ -1478,12 +1492,12 @@
    1.87          }
    1.88  
    1.89          final String in = mi[0];
    1.90 -        out.append(accessClass(in.replace('/', '_')));
    1.91 -        out.append("(false).");
    1.92 -        if (mn.startsWith("cons_")) {
    1.93 -            out.append("constructor.");
    1.94 -        }
    1.95 -        out.append(mn);
    1.96 +        out.append(accessMember(
    1.97 +                       accessClass(in.replace('/', '_')) + "(false)",
    1.98 +                       mn.startsWith("cons_")
    1.99 +                              ? "constructor." + mn
   1.100 +                              : mn,
   1.101 +                       mi));
   1.102          if (isStatic) {
   1.103              out.append('(');
   1.104          } else {
   1.105 @@ -1522,8 +1536,7 @@
   1.106                 .append(" = ");
   1.107          }
   1.108  
   1.109 -        out.append(vars[0]).append('.');
   1.110 -        out.append(mn);
   1.111 +        out.append(accessMember(vars[0].toString(), mn, mi));
   1.112          out.append('(');
   1.113          String sep = "";
   1.114          for (int j = 1; j < numArguments; ++j) {