rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
changeset 1409 3d1612be40bc
parent 1392 da9e5973e699
child 1421 b8e33a00bfab
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Wed Oct 30 17:15:23 2013 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Nov 07 09:41:45 2013 +0100
     1.3 @@ -139,7 +139,7 @@
     1.4          if (proto == null) {
     1.5              String sc = jc.getSuperClassName(); // with _
     1.6              out.append("\n    var pp = ").
     1.7 -                append(accessClass(sc.replace('/', '_'))).append("(true);");
     1.8 +                append(accessClass(mangleClassName(sc))).append("(true);");
     1.9              out.append("\n    var p = CLS.prototype = pp;");
    1.10              out.append("\n    var c = p;");
    1.11              out.append("\n    var sprcls = pp.constructor.$class;");
    1.12 @@ -975,7 +975,7 @@
    1.13                      int indx = readUShortArg(byteCodes, i);
    1.14                      String ci = jc.getClassName(indx);
    1.15                      emit(out, "var @1 = new @2;",
    1.16 -                         smapper.pushA(), accessClass(ci.replace('/', '_')));
    1.17 +                         smapper.pushA(), accessClass(mangleClassName(ci)));
    1.18                      addReference(ci);
    1.19                      i += 2;
    1.20                      break;
    1.21 @@ -1214,7 +1214,7 @@
    1.22                      int indx = readUShortArg(byteCodes, i);
    1.23                      String[] fi = jc.getFieldInfoName(indx);
    1.24                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.25 -                    final String mangleClass = mangleSig(fi[0]);
    1.26 +                    final String mangleClass = mangleClassName(fi[0]);
    1.27                      final String mangleClassAccess = accessClass(mangleClass);
    1.28                      emit(out, "var @2 = @4(false)._@3.call(@1);",
    1.29                           smapper.popA(),
    1.30 @@ -1227,7 +1227,7 @@
    1.31                      int indx = readUShortArg(byteCodes, i);
    1.32                      String[] fi = jc.getFieldInfoName(indx);
    1.33                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.34 -                    final String mangleClass = mangleSig(fi[0]);
    1.35 +                    final String mangleClass = mangleClassName(fi[0]);
    1.36                      final String mangleClassAccess = accessClass(mangleClass);
    1.37                      emit(out, "@4(false)._@3.call(@2, @1);",
    1.38                           smapper.popT(type),
    1.39 @@ -1243,7 +1243,7 @@
    1.40                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.41                      emit(out, "var @1 = @2(false)._@3();",
    1.42                           smapper.pushT(type),
    1.43 -                         accessClass(fi[0].replace('/', '_')), fi[1]);
    1.44 +                         accessClass(mangleClassName(fi[0])), fi[1]);
    1.45                      i += 2;
    1.46                      addReference(fi[0]);
    1.47                      break;
    1.48 @@ -1253,7 +1253,7 @@
    1.49                      String[] fi = jc.getFieldInfoName(indx);
    1.50                      final int type = VarType.fromFieldType(fi[2].charAt(0));
    1.51                      emit(out, "@1(false)._@2(@3);",
    1.52 -                         accessClass(fi[0].replace('/', '_')), fi[1],
    1.53 +                         accessClass(mangleClassName(fi[0])), fi[1],
    1.54                           smapper.popT(type));
    1.55                      i += 2;
    1.56                      addReference(fi[0]);
    1.57 @@ -1435,8 +1435,20 @@
    1.58          return mangleSig(sig, 0, sig.length());
    1.59      }
    1.60      
    1.61 +    private static String mangleMethodName(String name) {
    1.62 +        StringBuilder sb = new StringBuilder(name.length() * 2);
    1.63 +        int last = name.length();
    1.64 +        for (int i = 0; i < last; i++) {
    1.65 +            final char ch = name.charAt(i);
    1.66 +            switch (ch) {
    1.67 +                case '_': sb.append("_1"); break;
    1.68 +                default: sb.append(ch); break;
    1.69 +            }
    1.70 +        }
    1.71 +        return sb.toString();
    1.72 +    }
    1.73      private static String mangleSig(String txt, int first, int last) {
    1.74 -        StringBuilder sb = new StringBuilder();
    1.75 +        StringBuilder sb = new StringBuilder((last - first) * 2);
    1.76          for (int i = first; i < last; i++) {
    1.77              final char ch = txt.charAt(i);
    1.78              switch (ch) {
    1.79 @@ -1449,6 +1461,10 @@
    1.80          }
    1.81          return sb.toString();
    1.82      }
    1.83 +    
    1.84 +    private static String mangleClassName(String name) {
    1.85 +        return mangleSig(name);
    1.86 +    }
    1.87  
    1.88      private static String findMethodName(MethodData m, StringBuilder cnt) {
    1.89          StringBuilder name = new StringBuilder();
    1.90 @@ -1457,7 +1473,7 @@
    1.91          } else if ("<clinit>".equals(m.getName())) { // NOI18N
    1.92              name.append("class"); // NOI18N
    1.93          } else {
    1.94 -            name.append(m.getName());
    1.95 +            name.append(mangleMethodName(m.getName()));
    1.96          } 
    1.97          
    1.98          countArgs(m.getInternalSig(), new char[1], name, cnt);
    1.99 @@ -1471,7 +1487,7 @@
   1.100          if ("<init>".equals(nm)) { // NOI18N
   1.101              name.append("cons"); // NOI18N
   1.102          } else {
   1.103 -            name.append(nm);
   1.104 +            name.append(mangleMethodName(nm));
   1.105          }
   1.106          countArgs(descr, returnType, name, cnt);
   1.107          return name.toString();
   1.108 @@ -1499,7 +1515,7 @@
   1.109          }
   1.110  
   1.111          final String in = mi[0];
   1.112 -        out.append(accessClass(in.replace('/', '_')));
   1.113 +        out.append(accessClass(mangleClassName(in)));
   1.114          out.append("(false).");
   1.115          if (mn.startsWith("cons_")) {
   1.116              out.append("constructor.");
   1.117 @@ -1585,7 +1601,7 @@
   1.118                  s = accessClass("java_lang_Class") + "(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('" + classRef[0] + "');";
   1.119              } else {
   1.120                  addReference(classRef[0]);
   1.121 -                s = accessClass(s.replace('/', '_')) + "(false).constructor.$class";
   1.122 +                s = accessClass(mangleClassName(s)) + "(false).constructor.$class";
   1.123              }
   1.124          }
   1.125          return s;
   1.126 @@ -1695,7 +1711,7 @@
   1.127              int paramBeg = body.indexOf('(', sigEnd + 1);
   1.128              
   1.129              sb.append("vm.").append(pkgName.replace('/', '_')).append("_$JsCallbacks$(false)._VM().");
   1.130 -            sb.append(mangle(fqn, method, params, false));
   1.131 +            sb.append(mangleJsCallbacks(fqn, method, params, false));
   1.132              sb.append("(").append(refId);
   1.133              if (body.charAt(paramBeg + 1) != ')') {
   1.134                  sb.append(",");
   1.135 @@ -1732,12 +1748,13 @@
   1.136              int paramBeg = body.indexOf('(', sigEnd + 1);
   1.137              
   1.138              sb.append("vm.").append(pkgName.replace('/', '_')).append("_$JsCallbacks$(false)._VM().");
   1.139 -            sb.append(mangle(fqn, method, params, true));
   1.140 +            sb.append(mangleJsCallbacks(fqn, method, params, true));
   1.141              sb.append("(");
   1.142              pos = paramBeg + 1;
   1.143          }
   1.144      }
   1.145 -    private static String mangle(String fqn, String method, String params, boolean isStatic) {
   1.146 +
   1.147 +    static String mangleJsCallbacks(String fqn, String method, String params, boolean isStatic) {
   1.148          if (params.startsWith("(")) {
   1.149              params = params.substring(1);
   1.150          }
   1.151 @@ -1745,28 +1762,23 @@
   1.152              params = params.substring(0, params.length() - 1);
   1.153          }
   1.154          StringBuilder sb = new StringBuilder();
   1.155 -        final String rfqn = replace(fqn);
   1.156 -        final String rm = replace(method);
   1.157 -        final String rp = replace(params);
   1.158 +        final String fqnu = fqn.replace('.', '_');
   1.159 +        final String rfqn = mangleClassName(fqnu);
   1.160 +        final String rm = mangleMethodName(method);
   1.161 +        final String rp = mangleSig(params);
   1.162 +        final String mrp = mangleMethodName(rp);
   1.163          sb.append(rfqn).append("$").append(rm).
   1.164 -            append('$').append(rp).append("__Ljava_lang_Object_2");
   1.165 +            append('$').append(mrp).append("__Ljava_lang_Object_2");
   1.166          if (!isStatic) {
   1.167 -            sb.append('L').append(rfqn).append("_2");
   1.168 +            sb.append('L').append(fqnu).append("_2");
   1.169          }
   1.170          sb.append(rp);
   1.171          return sb.toString();
   1.172      }
   1.173  
   1.174 -    private static String replace(String orig) {
   1.175 -        return orig.replace("_", "_1").
   1.176 -            replace(";", "_2").
   1.177 -            replace("[", "_3").
   1.178 -            replace('.', '_').replace('/', '_');
   1.179 -    }
   1.180 -    
   1.181      private static String className(ClassData jc) {
   1.182          //return jc.getName().getInternalName().replace('/', '_');
   1.183 -        return jc.getClassName().replace('/', '_');
   1.184 +        return mangleClassName(jc.getClassName());
   1.185      }
   1.186      
   1.187      private static String[] findAnnotation(
   1.188 @@ -1879,7 +1891,7 @@
   1.189                  final String slashType = attrType.substring(1, attrType.length() - 1);
   1.190                  requireReference(slashType);
   1.191                  
   1.192 -                out.append(accessClass(slashType.replace('/', '_')))
   1.193 +                out.append(accessClass(mangleClassName(slashType)))
   1.194                     .append("(false).constructor.fld_").append(value);
   1.195              }
   1.196          };