Using 's' instead of Ljava_lang_String_2 TypeNickNames
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 03 Jan 2013 11:20:40 +0100
branchTypeNickNames
changeset 405e41809be6106
parent 404 dd2f85a6bbba
child 406 2670f519a46d
Using 's' instead of Ljava_lang_String_2
emul/src/main/java/java/lang/reflect/Method.java
javap/src/main/java/org/apidesign/javap/AnnotationParser.java
launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java
launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/harness.xhtml
vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/main/java/org/apidesign/vm4brwsr/VM.java
vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java
vm/src/test/java/org/apidesign/vm4brwsr/ByteCodeToJavaScriptTest.java
vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java
vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java
vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java
vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java
vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java
vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java
vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java
     1.1 --- a/emul/src/main/java/java/lang/reflect/Method.java	Thu Jan 03 11:13:40 2013 +0100
     1.2 +++ b/emul/src/main/java/java/lang/reflect/Method.java	Thu Jan 03 11:20:40 2013 +0100
     1.3 @@ -148,6 +148,7 @@
     1.4              case 'B': return Byte.TYPE;
     1.5              case 'Z': return Boolean.TYPE;
     1.6              case 'S': return Short.TYPE;
     1.7 +            case 's': return String.class;
     1.8  //            case 'V': return Void.TYPE;
     1.9              case 'L': try {
    1.10                  int up = sig.indexOf("_2");
     2.1 --- a/javap/src/main/java/org/apidesign/javap/AnnotationParser.java	Thu Jan 03 11:13:40 2013 +0100
     2.2 +++ b/javap/src/main/java/org/apidesign/javap/AnnotationParser.java	Thu Jan 03 11:20:40 2013 +0100
     2.3 @@ -99,7 +99,7 @@
     2.4              String val = cd.stringValue(primitive, textual);
     2.5              String attrType;
     2.6              if (type == 's') {
     2.7 -                attrType = "Ljava_lang_String_2";
     2.8 +                attrType = "s";
     2.9                  if (textual) {
    2.10                      val = '"' + val + '"';
    2.11                  }
     3.1 --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java	Thu Jan 03 11:13:40 2013 +0100
     3.2 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java	Thu Jan 03 11:20:40 2013 +0100
     3.3 @@ -49,7 +49,7 @@
     3.4          try {
     3.5              mi.result(code.invokeMethod(
     3.6                  console,
     3.7 -                "invoke__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2",
     3.8 +                "invoke__sss",
     3.9                  mi.className, mi.methodName).toString(), null);
    3.10          } catch (ScriptException | NoSuchMethodException ex) {
    3.11              mi.result(null, ex);
     4.1 --- a/launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/harness.xhtml	Thu Jan 03 11:13:40 2013 +0100
     4.2 +++ b/launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/harness.xhtml	Thu Jan 03 11:20:40 2013 +0100
     4.3 @@ -33,7 +33,7 @@
     4.4          </textarea>
     4.5          
     4.6          <script type="text/javascript">
     4.7 -            vm.loadClass('org.apidesign.bck2brwsr.launcher.Console').harness__VLjava_lang_String_2('$U/../data');
     4.8 +            vm.loadClass('org.apidesign.bck2brwsr.launcher.Console').harness__Vs('$U/../data');
     4.9          </script>
    4.10      </body>
    4.11  </html>
     5.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java	Thu Jan 03 11:13:40 2013 +0100
     5.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java	Thu Jan 03 11:20:40 2013 +0100
     5.3 @@ -28,7 +28,7 @@
     5.4   * be used to bootstrap and load the virtual machine: <pre>
     5.5   * var vm = bck2brwsr();
     5.6   * var main = vm.loadClass('org.your.pkg.Main');
     5.7 - * main.main__V_3Ljava_lang_String_2(null);
     5.8 + * main.main__V_3s(null);
     5.9   * </pre>
    5.10   * In case one wants to initialize the virtual machine with ability to
    5.11   * load classes lazily when needed, one can provide a loader function to
     6.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Jan 03 11:13:40 2013 +0100
     6.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Jan 03 11:20:40 2013 +0100
     6.3 @@ -19,6 +19,7 @@
     6.4  
     6.5  import java.io.IOException;
     6.6  import java.io.InputStream;
     6.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     6.8  import org.apidesign.javap.AnnotationParser;
     6.9  import org.apidesign.javap.ClassData;
    6.10  import org.apidesign.javap.FieldData;
    6.11 @@ -1271,9 +1272,18 @@
    6.12                  default: sb.append(ch); break;
    6.13              }
    6.14          }
    6.15 +        final String strng = "Ljava_lang_String_2";
    6.16 +        for(;;) {
    6.17 +            int pos = sb.indexOf(strng);
    6.18 +            if (pos == -1) {
    6.19 +                break;
    6.20 +            }
    6.21 +            sb.delete(pos, pos + strng.length());
    6.22 +            sb.insert(pos, 's');
    6.23 +        }
    6.24          return sb.toString();
    6.25      }
    6.26 -
    6.27 +    
    6.28      private static String findMethodName(MethodData m, StringBuilder cnt) {
    6.29          StringBuilder name = new StringBuilder();
    6.30          if ("<init>".equals(m.getName())) { // NOI18N
     7.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu Jan 03 11:13:40 2013 +0100
     7.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Thu Jan 03 11:20:40 2013 +0100
     7.3 @@ -117,12 +117,12 @@
     7.4              + "    var loader = {};\n"
     7.5              + "    loader.vm = vm;\n"
     7.6              + "    loader.loadClass = function(name) {\n"
     7.7 -            + "      var attr = name.replace__Ljava_lang_String_2CC(name, '.','_');\n"
     7.8 +            + "      var attr = name.replace__sCC(name, '.','_');\n"
     7.9              + "      var fn = vm[attr];\n"
    7.10              + "      if (fn) return fn(false);\n"
    7.11              + "      if (!args[0]) throw 'bck2brwsr initialized without loader function, cannot load ' + name;\n"
    7.12              + "      return vm.org_apidesign_vm4brwsr_VMLazy(false).\n"
    7.13 -            + "        load___3Ljava_lang_Object_2Ljava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, name, args);\n"
    7.14 +            + "        load___3Ljava_lang_Object_2Ljava_lang_Object_2s_3Ljava_lang_Object_2(loader, name, args);\n"
    7.15              + "    }\n"
    7.16              + "    if (args[0]) vm.loadClass = loader.loadClass;\n"
    7.17              + "    return loader;\n"
     8.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Thu Jan 03 11:13:40 2013 +0100
     8.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java	Thu Jan 03 11:20:40 2013 +0100
     8.3 @@ -86,7 +86,7 @@
     8.4  
     8.5  /* possibly not needed:
     8.6      @JavaScriptBody(args = {"loader", "n" }, body =
     8.7 -        "var cls = n.replace__Ljava_lang_String_2CC(n, '.','_').toString();" +
     8.8 +        "var cls = n.replace__sCC(n, '.','_').toString();" +
     8.9          "loader.vm[cls] = true;\n"
    8.10      )
    8.11      private static native void beingDefined(Object loader, String name);
    8.12 @@ -114,15 +114,15 @@
    8.13          
    8.14          @JavaScriptBody(args = {"self", "n"},
    8.15          body =
    8.16 -        "var cls = n.replace__Ljava_lang_String_2CC(n, '/','_').toString();"
    8.17 -        + "\nvar dot = n.replace__Ljava_lang_String_2CC(n,'/','.').toString();"
    8.18 +        "var cls = n.replace__sCC(n, '/','_').toString();"
    8.19 +        + "\nvar dot = n.replace__sCC(n,'/','.').toString();"
    8.20          + "\nvar lazy = self.fld_lazy;"
    8.21          + "\nvar loader = lazy.fld_loader;"
    8.22          + "\nvar vm = loader.vm;"
    8.23          + "\nif (vm[cls]) return false;"
    8.24          + "\nvm[cls] = function() {"
    8.25          + "\n  var instance = arguments.length == 0 || arguments[0] === true;"
    8.26 -        + "\n  return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(lazy, dot, instance);"
    8.27 +        + "\n  return lazy.load__Ljava_lang_Object_2sZ(lazy, dot, instance);"
    8.28          + "\n};"
    8.29          + "\nreturn true;")
    8.30          @Override
     9.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ByteCodeToJavaScriptTest.java	Thu Jan 03 11:13:40 2013 +0100
     9.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ByteCodeToJavaScriptTest.java	Thu Jan 03 11:20:40 2013 +0100
     9.3 @@ -38,7 +38,7 @@
     9.4          }, cnt, returnType);
     9.5          assertEquals(cnt.toString(), "000", "No doubles or longs");
     9.6          assertTrue(returnType[0] != 'V', "Returns string");
     9.7 -        assertEquals(ret, "replace__Ljava_lang_String_2Ljava_lang_String_2CC");
     9.8 +        assertEquals(ret, "replace__ssCC");
     9.9      }
    9.10  
    9.11      @Test
    9.12 @@ -50,6 +50,17 @@
    9.13          }, cnt, returnType);
    9.14          assertEquals(cnt.toString(), "0", "No doubles or longs");
    9.15          assertTrue(returnType[0] != 'V', "Returns string");
    9.16 -        assertEquals(ret, "toJavaScript__Ljava_lang_String_2_3B");
    9.17 +        assertEquals(ret, "toJavaScript__s_3B");
    9.18 +    }
    9.19 +    @Test
    9.20 +    public void manglingProblemWithInteger() {
    9.21 +        StringBuilder cnt = new StringBuilder();
    9.22 +        char[] returnType = { 'V' };
    9.23 +        String ret = ByteCodeToJavaScript.findMethodName(new String[] { 
    9.24 +            "VMinVM", "toJavaScript", "(II)Ljava/lang/String;"
    9.25 +        }, cnt, returnType);
    9.26 +        assertEquals(cnt.toString(), "00", "No doubles or longs");
    9.27 +        assertTrue(returnType[0] != 'V', "Returns string");
    9.28 +        assertEquals(ret, "toJavaScript__sII");
    9.29      }
    9.30  }
    10.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Thu Jan 03 11:13:40 2013 +0100
    10.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Thu Jan 03 11:20:40 2013 +0100
    10.3 @@ -48,25 +48,25 @@
    10.4          assertEquals(Classes.classForInstance(), "java.io.IOException");
    10.5      }
    10.6      @Test public void jsInstanceName() throws Exception {
    10.7 -        assertExec("I/O name", Classes.class, "classForInstance__Ljava_lang_String_2", "java.io.IOException");
    10.8 +        assertExec("I/O name", Classes.class, "classForInstance__s", "java.io.IOException");
    10.9      }
   10.10      @Test public void javaName() throws Exception {
   10.11          assertEquals(Classes.name(), "java.io.IOException");
   10.12      }
   10.13      @Test public void jsName() throws Exception {
   10.14 -        assertExec("I/O name", Classes.class, "name__Ljava_lang_String_2", "java.io.IOException");
   10.15 +        assertExec("I/O name", Classes.class, "name__s", "java.io.IOException");
   10.16      }
   10.17      @Test public void javaSimpleName() throws Exception {
   10.18          assertEquals(Classes.simpleName(), "IOException");
   10.19      }
   10.20      @Test public void jsGetsSimpleName() throws Exception {
   10.21 -        assertExec("I/O simple name", Classes.class, "simpleName__Ljava_lang_String_2", "IOException");
   10.22 +        assertExec("I/O simple name", Classes.class, "simpleName__s", "IOException");
   10.23      }
   10.24      @Test public void javaCanonicalName() {
   10.25          assertEquals(Classes.canonicalName(), "java.io.IOException");
   10.26      }
   10.27      @Test public void jsCanonicalName() throws Exception {
   10.28 -        assertExec("I/O simple name", Classes.class, "canonicalName__Ljava_lang_String_2", "java.io.IOException");
   10.29 +        assertExec("I/O simple name", Classes.class, "canonicalName__s", "java.io.IOException");
   10.30      }
   10.31      @Test public void javaNewInstance() throws Exception {
   10.32          assertTrue(Classes.newInstance());
   10.33 @@ -80,7 +80,7 @@
   10.34          );
   10.35      }
   10.36      @Test public void jsNoNewInstance() throws Exception {
   10.37 -        assertExec("Check problems with new instance", Classes.class, "newInstanceNoPubConstructor__Ljava_lang_String_2", 
   10.38 +        assertExec("Check problems with new instance", Classes.class, "newInstanceNoPubConstructor__s", 
   10.39              "java.lang.InstantiationException:java.lang.Float"
   10.40          );
   10.41      }
   10.42 @@ -88,17 +88,17 @@
   10.43          assertExec("Check class annotation", Classes.class, "getMarker__I", Double.valueOf(10));
   10.44      }
   10.45      @Test public void jsStringAnnotation() throws Exception {
   10.46 -        assertExec("Check class annotation", Classes.class, "getNamer__Ljava_lang_String_2Z", "my text", true);
   10.47 +        assertExec("Check class annotation", Classes.class, "getNamer__sZ", "my text", true);
   10.48      }
   10.49      @Test public void jsStringAnnotationFromArray() throws Exception {
   10.50 -        assertExec("Check class annotation", Classes.class, "getNamer__Ljava_lang_String_2Z", "my text", false);
   10.51 +        assertExec("Check class annotation", Classes.class, "getNamer__sZ", "my text", false);
   10.52      }
   10.53      @Test public void javaInvokeMethod() throws Exception {
   10.54          assertEquals(Classes.reflectiveMethodCall(true, "name"), "java.io.IOException", "Calls the name() method via reflection");
   10.55      }
   10.56      @Test public void jsInvokeMethod() throws Exception {
   10.57          assertExec("Calls the name() method via reflection", Classes.class, 
   10.58 -            "reflectiveMethodCall__Ljava_lang_Object_2ZLjava_lang_String_2", 
   10.59 +            "reflectiveMethodCall__Ljava_lang_Object_2Zs", 
   10.60              "java.io.IOException", true, "name"
   10.61          );
   10.62      }
   10.63 @@ -107,19 +107,19 @@
   10.64      }
   10.65      @Test public void jsFindMethod() throws Exception {
   10.66          assertExec("Calls the name() method via reflection", Classes.class, 
   10.67 -            "reflectiveMethodCall__Ljava_lang_Object_2ZLjava_lang_String_2", 
   10.68 +            "reflectiveMethodCall__Ljava_lang_Object_2Zs", 
   10.69              "java.io.IOException", false, "name"
   10.70          );
   10.71      }
   10.72      @Test public void primitiveReturnType() throws Exception {
   10.73          assertExec("Tries to get an integer via reflection", Classes.class, 
   10.74 -            "primitiveType__Ljava_lang_String_2Ljava_lang_String_2", 
   10.75 +            "primitiveType__ss", 
   10.76              Classes.primitiveType("primitive"), "primitive"
   10.77          );
   10.78      }
   10.79      @Test public void primitiveBoolReturnType() throws Exception {
   10.80          assertExec("Tries to get an integer via reflection", Classes.class, 
   10.81 -            "primitiveType__Ljava_lang_String_2Ljava_lang_String_2", 
   10.82 +            "primitiveType__ss", 
   10.83              Classes.primitiveType("primitiveB"), "primitiveB"
   10.84          );
   10.85      }
   10.86 @@ -128,33 +128,33 @@
   10.87      }
   10.88      @Test public void jsAnnotatedMethod() throws Exception {
   10.89          assertExec("Calls the name() method via reflection", Classes.class, 
   10.90 -            "reflectiveMethodCall__Ljava_lang_Object_2ZLjava_lang_String_2", 
   10.91 +            "reflectiveMethodCall__Ljava_lang_Object_2Zs", 
   10.92              "java.io.IOException", false, null
   10.93          );
   10.94      }
   10.95      @Test public void jsClassParam() throws Exception {
   10.96          assertExec("Calls the nameOfIO()", Classes.class, 
   10.97 -            "nameOfIO__Ljava_lang_String_2", 
   10.98 +            "nameOfIO__s", 
   10.99              "java.io.IOException"
  10.100          );
  10.101      }
  10.102      @Test public void noInterface() throws Exception {
  10.103          assertExec("Calls Class.isInterface", Classes.class, 
  10.104 -            "isInterface__ZLjava_lang_String_2", 
  10.105 +            "isInterface__Zs", 
  10.106              0.0, "java.lang.String"
  10.107          );
  10.108      }
  10.109      /*
  10.110      @Test public void isInterface() throws Exception {
  10.111          assertExec("Calls Class.isInterface", Classes.class, 
  10.112 -            "isInterface__ZLjava_lang_String_2", 
  10.113 +            "isInterface__Zs", 
  10.114              1.0, "java.lang.Runnable"
  10.115          );
  10.116      }
  10.117      */
  10.118      @Test public void integerType() throws Exception {
  10.119          assertExec("Computes the type", Classes.class, 
  10.120 -            "intType__Ljava_lang_String_2", 
  10.121 +            "intType__s", 
  10.122              Classes.intType()
  10.123          );
  10.124      }
    11.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java	Thu Jan 03 11:13:40 2013 +0100
    11.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ExceptionsTest.java	Thu Jan 03 11:20:40 2013 +0100
    11.3 @@ -48,7 +48,7 @@
    11.4      
    11.5      @Test public void createObject() throws Exception {
    11.6          assertExec("Object created", Exceptions.class, 
    11.7 -            "newInstance__Ljava_lang_String_2Ljava_lang_String_2",
    11.8 +            "newInstance__ss",
    11.9              "java.lang.Object",
   11.10              "java.lang.Object"
   11.11          );
   11.12 @@ -56,7 +56,7 @@
   11.13  
   11.14      @Test public void createFloatFails() throws Exception {
   11.15          assertExec("Float not created", Exceptions.class, 
   11.16 -            "newInstance__Ljava_lang_String_2Ljava_lang_String_2",
   11.17 +            "newInstance__ss",
   11.18              "java.lang.Float",
   11.19              "java.lang.Float"
   11.20          );
   11.21 @@ -64,7 +64,7 @@
   11.22  
   11.23      @Test public void createUnknownFails() throws Exception {
   11.24          assertExec("Object created", Exceptions.class, 
   11.25 -            "newInstance__Ljava_lang_String_2Ljava_lang_String_2",
   11.26 +            "newInstance__ss",
   11.27              "CNFE:org.apidesign.Unknown",
   11.28              "org.apidesign.Unknown"
   11.29          );
   11.30 @@ -74,7 +74,7 @@
   11.31          Object vm = code.invokeFunction("bck2brwsr");
   11.32          Object clazz = code.invokeMethod(vm, "loadClass", Exceptions.class.getName());
   11.33          
   11.34 -        String method = "readCounter__ILjava_lang_String_2";
   11.35 +        String method = "readCounter__Is";
   11.36          
   11.37          try {
   11.38              Object ret = code.invokeMethod(clazz, method, "org.apidesign.Unknown");
    12.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Thu Jan 03 11:13:40 2013 +0100
    12.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Thu Jan 03 11:20:40 2013 +0100
    12.3 @@ -29,19 +29,19 @@
    12.4   */
    12.5  public class NumberTest {
    12.6      @Test public void integerFromString() throws Exception {
    12.7 -        assertExec("Can convert string to integer", Integer.class, "parseInt__ILjava_lang_String_2",
    12.8 +        assertExec("Can convert string to integer", Integer.class, "parseInt__Is",
    12.9              Double.valueOf(333), "333"
   12.10          );
   12.11      }
   12.12  
   12.13      @Test public void doubleFromString() throws Exception {
   12.14 -        assertExec("Can convert string to double", Double.class, "parseDouble__DLjava_lang_String_2",
   12.15 +        assertExec("Can convert string to double", Double.class, "parseDouble__Ds",
   12.16              Double.valueOf(33.3), "33.3"
   12.17          );
   12.18      }
   12.19  
   12.20      @Test public void autoboxDouble() throws Exception {
   12.21 -        assertExec("Autoboxing of doubles is OK", Numbers.class, "autoboxDblToString__Ljava_lang_String_2",
   12.22 +        assertExec("Autoboxing of doubles is OK", Numbers.class, "autoboxDblToString__s",
   12.23              "3.3"
   12.24          );
   12.25      }
   12.26 @@ -131,7 +131,7 @@
   12.27      @Test public void fiveInStringJS() throws Exception {
   12.28          String s = Numbers.intToString();
   12.29          assertExec("Should be the same: " + s, 
   12.30 -            Numbers.class, "intToString__Ljava_lang_String_2", 
   12.31 +            Numbers.class, "intToString__s", 
   12.32              s
   12.33          );
   12.34      }
   12.35 @@ -139,7 +139,7 @@
   12.36      @Test public void sevenInStringJS() throws Exception {
   12.37          String s = Numbers.floatToString();
   12.38          assertExec("Should be the same: " + s, 
   12.39 -            Numbers.class, "floatToString__Ljava_lang_String_2", 
   12.40 +            Numbers.class, "floatToString__s", 
   12.41              s
   12.42          );
   12.43      }
    13.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Thu Jan 03 11:13:40 2013 +0100
    13.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Thu Jan 03 11:20:40 2013 +0100
    13.3 @@ -201,7 +201,7 @@
    13.4      @Test public void javaScriptBody() throws Exception {
    13.5          assertExec(
    13.6              "JavaScript string",
    13.7 -            StaticMethod.class, "i2s__Ljava_lang_String_2II",
    13.8 +            StaticMethod.class, "i2s__sII",
    13.9              "333",
   13.10              330, 3
   13.11          );
   13.12 @@ -210,7 +210,7 @@
   13.13      @Test public void switchJarda() throws Exception {
   13.14          assertExec(
   13.15              "The expected value",
   13.16 -            StaticMethod.class, "swtch__Ljava_lang_String_2I",
   13.17 +            StaticMethod.class, "swtch__sI",
   13.18              "Jarda",
   13.19              0
   13.20          );
   13.21 @@ -219,7 +219,7 @@
   13.22      @Test public void switchDarda() throws Exception {
   13.23          assertExec(
   13.24              "The expected value",
   13.25 -            StaticMethod.class, "swtch__Ljava_lang_String_2I",
   13.26 +            StaticMethod.class, "swtch__sI",
   13.27              "Darda",
   13.28              1
   13.29          );
   13.30 @@ -227,7 +227,7 @@
   13.31      @Test public void switchParda() throws Exception {
   13.32          assertExec(
   13.33              "The expected value",
   13.34 -            StaticMethod.class, "swtch2__Ljava_lang_String_2I",
   13.35 +            StaticMethod.class, "swtch2__sI",
   13.36              "Parda",
   13.37              22
   13.38          );
   13.39 @@ -235,7 +235,7 @@
   13.40      @Test public void switchMarda() throws Exception {
   13.41          assertExec(
   13.42              "The expected value",
   13.43 -            StaticMethod.class, "swtch__Ljava_lang_String_2I",
   13.44 +            StaticMethod.class, "swtch__sI",
   13.45              "Marda",
   13.46              -433
   13.47          );
   13.48 @@ -243,7 +243,7 @@
   13.49      
   13.50      @Test public void checkNullCast() throws Exception {
   13.51          assertExec("Null can be cast to any type",
   13.52 -            StaticMethod.class, "castNull__Ljava_lang_String_2Z", 
   13.53 +            StaticMethod.class, "castNull__sZ", 
   13.54              null, true
   13.55          );
   13.56      }
    14.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java	Thu Jan 03 11:13:40 2013 +0100
    14.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java	Thu Jan 03 11:20:40 2013 +0100
    14.3 @@ -97,6 +97,20 @@
    14.4          return -1;
    14.5      }
    14.6      
    14.7 +    public static String replaceWithS(String value) {
    14.8 +        StringBuilder sb = new StringBuilder(value);
    14.9 +        final String strng = "Ljava_lang_String_2";
   14.10 +        for (;;) {
   14.11 +            int pos = sb.indexOf(strng);
   14.12 +            if (pos == -1) {
   14.13 +                break;
   14.14 +            }
   14.15 +            sb.delete(pos, strng.length());
   14.16 +            sb.insert(pos, 's');
   14.17 +        }
   14.18 +        return sb.toString().toString();
   14.19 +    }
   14.20 +    
   14.21      public static String toStringTest(int howMuch) {
   14.22          counter = 0;
   14.23          StringSample ss = null;
    15.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Thu Jan 03 11:13:40 2013 +0100
    15.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Thu Jan 03 11:20:40 2013 +0100
    15.3 @@ -38,7 +38,7 @@
    15.4      @Test public void fromChars() throws Exception {
    15.5          assertExec(
    15.6              "First char in Hello is ABC",
    15.7 -            StringSample.class, "fromChars__Ljava_lang_String_2CCC",
    15.8 +            StringSample.class, "fromChars__sCCC",
    15.9              "ABC", 'A', 'B', 'C'
   15.10          );
   15.11      }
   15.12 @@ -46,7 +46,7 @@
   15.13      @Test public void concatChars() throws Exception {
   15.14          assertExec(
   15.15              "Composing yields ABC",
   15.16 -            StringSample.class, "chars__Ljava_lang_String_2CCC",
   15.17 +            StringSample.class, "chars__sCCC",
   15.18              "ABC", 'A', 'B', 'C'
   15.19          );
   15.20      }
   15.21 @@ -54,7 +54,7 @@
   15.22      @Test public void concatCharsFromInts() throws Exception {
   15.23          assertExec(
   15.24              "Composing yields ABC",
   15.25 -            StringSample.class, "charsFromNumbers__Ljava_lang_String_2",
   15.26 +            StringSample.class, "charsFromNumbers__s",
   15.27              "ABC"
   15.28          );
   15.29      }
   15.30 @@ -62,7 +62,7 @@
   15.31      @Test public void concatCharsFromChars() throws Exception {
   15.32          assertExec(
   15.33              "Composing yields ABC",
   15.34 -            StringSample.class, "charsFromChars__Ljava_lang_String_2",
   15.35 +            StringSample.class, "charsFromChars__s",
   15.36              "ABC"
   15.37          );
   15.38      }
   15.39 @@ -78,7 +78,7 @@
   15.40      @Test(timeOut=10000) public void toStringConcatenation() throws Exception {
   15.41          assertExec(
   15.42              "Five executions should generate 5Hello World!",
   15.43 -            StringSample.class, "toStringTest__Ljava_lang_String_2I",
   15.44 +            StringSample.class, "toStringTest__sI",
   15.45              "Hello World!5", 5
   15.46          );
   15.47      }
   15.48 @@ -89,7 +89,7 @@
   15.49      @Test(timeOut=10000) public void stringStringConcat() throws Exception {
   15.50          assertExec(
   15.51              "Composes strings OK",
   15.52 -            StringSample.class, "concatStrings__Ljava_lang_String_2",
   15.53 +            StringSample.class, "concatStrings__s",
   15.54              "Hello World!1" + "\\\n\r\t"
   15.55          );
   15.56      }
   15.57 @@ -104,14 +104,14 @@
   15.58      @Test public void replaceChars() throws Exception {
   15.59          assertExec(
   15.60              "Can replace slashes by underscores",
   15.61 -            StringSample.class, "replace__Ljava_lang_String_2Ljava_lang_String_2CC",
   15.62 +            StringSample.class, "replace__ssCC",
   15.63              "x_y_z", "x/y/z", '/', '_'
   15.64          );
   15.65      }
   15.66      @Test public void replaceIntChars() throws Exception {
   15.67          assertExec(
   15.68              "Can replace slashes by underscores",
   15.69 -            StringSample.class, "replace__Ljava_lang_String_2Ljava_lang_String_2CC",
   15.70 +            StringSample.class, "replace__ssCC",
   15.71              "x_y_z", "x/y/z", (int)'/', (int)'_'
   15.72          );
   15.73      }
   15.74 @@ -119,7 +119,7 @@
   15.75      @Test public void insertBuilder() throws Exception {
   15.76          assertExec(
   15.77              "Can insert something into a buffer?",
   15.78 -            StringSample.class, "insertBuffer__Ljava_lang_String_2",
   15.79 +            StringSample.class, "insertBuffer__s",
   15.80              "Ahojdo!"
   15.81          );
   15.82      }
   15.83 @@ -129,7 +129,7 @@
   15.84          int jh = StringSample.hashCode(j);
   15.85          assertExec(
   15.86              "Hashcode is the same " +jh,
   15.87 -            StringSample.class, "hashCode__ILjava_lang_String_2",
   15.88 +            StringSample.class, "hashCode__Is",
   15.89              Double.valueOf(jh), j
   15.90          );
   15.91      }
   15.92 @@ -138,28 +138,28 @@
   15.93          int jh = StringSample.hashCode(j);
   15.94          assertExec(
   15.95              "Hashcode is the same " + jh,
   15.96 -            StringSample.class, "hashCode__ILjava_lang_String_2",
   15.97 +            StringSample.class, "hashCode__Is",
   15.98              Double.valueOf(jh), j
   15.99          );
  15.100      }
  15.101      @Test public void stringSwitch1() throws Exception {
  15.102          assertExec(
  15.103              "Get one",
  15.104 -            StringSample.class, "stringSwitch__ILjava_lang_String_2",
  15.105 +            StringSample.class, "stringSwitch__Is",
  15.106              Double.valueOf(1), "jedna"
  15.107          );
  15.108      }
  15.109      @Test public void stringSwitch2() throws Exception {
  15.110          assertExec(
  15.111              "Get two",
  15.112 -            StringSample.class, "stringSwitch__ILjava_lang_String_2",
  15.113 +            StringSample.class, "stringSwitch__Is",
  15.114              Double.valueOf(2), "dve"
  15.115          );
  15.116      }
  15.117      @Test public void stringSwitchDefault() throws Exception {
  15.118          assertExec(
  15.119              "Get -1",
  15.120 -            StringSample.class, "stringSwitch__ILjava_lang_String_2",
  15.121 +            StringSample.class, "stringSwitch__Is",
  15.122              Double.valueOf(-1), "none"
  15.123          );
  15.124      }
  15.125 @@ -168,12 +168,22 @@
  15.126          assertEquals(StringSample.countAB("Ahoj Bedo!"), 3, "Verify Java code is sane");
  15.127          assertExec(
  15.128              "One A and one B adds to 3",
  15.129 -            StringSample.class, "countAB__ILjava_lang_String_2",
  15.130 +            StringSample.class, "countAB__Is",
  15.131              Double.valueOf(3), "Ahoj Bedo!"
  15.132          );
  15.133          
  15.134      }
  15.135      
  15.136 +    @Test public void replaceInSB() throws Exception {
  15.137 +        final String text = "Ljava_lang_String_2";
  15.138 +        String exp = StringSample.replaceWithS(text);
  15.139 +        assertExec(
  15.140 +            "Also replaces the text",
  15.141 +            StringSample.class, "replaceWithS__ss",
  15.142 +            exp, text
  15.143 +        );
  15.144 +    }
  15.145 +    
  15.146      private static CharSequence codeSeq;
  15.147      private static Invocable code;
  15.148      
    16.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java	Thu Jan 03 11:13:40 2013 +0100
    16.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java	Thu Jan 03 11:20:40 2013 +0100
    16.3 @@ -59,7 +59,7 @@
    16.4          try {
    16.5              ret = code.invokeFunction("bck2brwsr");
    16.6              ret = code.invokeMethod(ret, "loadClass", VMinVM.class.getName());
    16.7 -            ret = code.invokeMethod(ret, "toJavaScript__Ljava_lang_String_2_3B", arr);
    16.8 +            ret = code.invokeMethod(ret, "toJavaScript__s_3B", arr);
    16.9          } catch (Exception ex) {
   16.10              File f = File.createTempFile("execution", ".js");
   16.11              FileWriter w = new FileWriter(f);