Using the same mangling scheme as JNI
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 04 Dec 2012 09:16:53 +0100
changeset 2480bfcb6585290
parent 245 5adda1327c15
child 249 001389026dbf
child 267 79697fa91bfc
child 268 e01b65623f72
Using the same mangling scheme as JNI
emul/src/main/java/java/lang/AbstractStringBuilder.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java
vm/src/test/java/org/apidesign/vm4brwsr/ByteCodeToJavaScriptTest.java
vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.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/StringTest.java
vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java
vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java
vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java
     1.1 --- a/emul/src/main/java/java/lang/AbstractStringBuilder.java	Mon Dec 03 19:51:46 2012 +0100
     1.2 +++ b/emul/src/main/java/java/lang/AbstractStringBuilder.java	Tue Dec 04 09:16:53 2012 +0100
     1.3 @@ -25,8 +25,6 @@
     1.4  
     1.5  package java.lang;
     1.6  
     1.7 -import org.apidesign.bck2brwsr.core.JavaScriptBody;
     1.8 -
     1.9  /**
    1.10   * A mutable sequence of characters.
    1.11   * <p>
    1.12 @@ -600,22 +598,8 @@
    1.13       * @param   i   an {@code int}.
    1.14       * @return  a reference to this object.
    1.15       */
    1.16 -    @JavaScriptBody(
    1.17 -        args={ "self", "i" },
    1.18 -        body="return java_lang_AbstractStringBuilder(true).appendLjava_lang_AbstractStringBuilderLjava_lang_String(self,i.toString());"
    1.19 -    )
    1.20      public AbstractStringBuilder append(int i) {
    1.21 -        if (i == Integer.MIN_VALUE) {
    1.22 -            append("-2147483648");
    1.23 -            return this;
    1.24 -        }
    1.25 -        int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1
    1.26 -                                     : Integer.stringSize(i);
    1.27 -        int spaceNeeded = count + appendedLength;
    1.28 -        ensureCapacityInternal(spaceNeeded);
    1.29 -        Integer.getChars(i, spaceNeeded, value);
    1.30 -        count = spaceNeeded;
    1.31 -        return this;
    1.32 +        return append(Integer.toString(i));
    1.33      }
    1.34  
    1.35      /**
     2.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java	Mon Dec 03 19:51:46 2012 +0100
     2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java	Tue Dec 04 09:16:53 2012 +0100
     2.3 @@ -57,7 +57,7 @@
     2.4      @JavaScriptBody(
     2.5          args={"el", "r"},
     2.6          body="var e = window.document.getElementById(el.fld_id);\n"
     2.7 -           + "e.onclick = function() { r.runV(); };\n"
     2.8 +           + "e.onclick = function() { r.run__V(); };\n"
     2.9      )
    2.10      public final void addOnClick(Runnable r) {
    2.11          throw new UnsupportedOperationException("Needs JavaScript!");
     3.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Dec 03 19:51:46 2012 +0100
     3.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Dec 04 09:16:53 2012 +0100
     3.3 @@ -169,7 +169,7 @@
     3.4          StringBuilder argsCnt = new StringBuilder();
     3.5          final String mn = findMethodName(m, argsCnt);
     3.6          out.append(prefix).append(mn).append(" = function");
     3.7 -        if (mn.equals("classV")) {
     3.8 +        if (mn.equals("class__V")) {
     3.9              toInitilize.add(className(jc) + "(false)." + mn);
    3.10          }
    3.11          out.append('(');
    3.12 @@ -798,6 +798,7 @@
    3.13          int i = 0;
    3.14          Boolean count = null;
    3.15          boolean array = false;
    3.16 +        sig.append("__");
    3.17          int firstPos = sig.length();
    3.18          while (i < descriptor.length()) {
    3.19              char ch = descriptor.charAt(i++);
    3.20 @@ -808,9 +809,6 @@
    3.21                  case ')':
    3.22                      count = false;
    3.23                      continue;
    3.24 -                case 'A':
    3.25 -                    array = true;
    3.26 -                    break;
    3.27                  case 'B': 
    3.28                  case 'C': 
    3.29                  case 'D': 
    3.30 @@ -821,7 +819,7 @@
    3.31                  case 'Z': 
    3.32                      if (count) {
    3.33                          if (array) {
    3.34 -                            sig.append('A');
    3.35 +                            sig.append("_3");
    3.36                          }
    3.37                          sig.append(ch);
    3.38                          if (ch == 'J' || ch == 'D') {
    3.39 @@ -833,7 +831,7 @@
    3.40                          hasReturnType[0] = true;
    3.41                          sig.insert(firstPos, ch);
    3.42                          if (array) {
    3.43 -                            sig.insert(firstPos, 'A');
    3.44 +                            sig.insert(firstPos, "_3");
    3.45                          }
    3.46                      }
    3.47                      array = false;
    3.48 @@ -845,33 +843,47 @@
    3.49                      continue;
    3.50                  case 'L':
    3.51                      int next = descriptor.indexOf(';', i);
    3.52 +                    String realSig = mangleSig(descriptor, i - 1, next + 1);
    3.53                      if (count) {
    3.54                          if (array) {
    3.55 -                            sig.append('A');
    3.56 +                            sig.append("_3");
    3.57                          }
    3.58 -                        sig.append(ch);
    3.59 -                        sig.append(descriptor.substring(i, next).replace('/', '_'));
    3.60 +                        sig.append(realSig);
    3.61                          cnt.append('0');
    3.62                      } else {
    3.63 -                        sig.insert(firstPos, descriptor.substring(i, next).replace('/', '_'));
    3.64 -                        sig.insert(firstPos, ch);
    3.65 +                        sig.insert(firstPos, realSig);
    3.66                          if (array) {
    3.67 -                            sig.insert(firstPos, 'A');
    3.68 +                            sig.insert(firstPos, "_3");
    3.69                          }
    3.70                          hasReturnType[0] = true;
    3.71                      }
    3.72                      i = next + 1;
    3.73                      continue;
    3.74                  case '[':
    3.75 -                    //arrays++;
    3.76 +                    array = true;
    3.77                      continue;
    3.78                  default:
    3.79 -                    break; // invalid character
    3.80 +                    throw new IllegalStateException("Invalid char: " + ch);
    3.81              }
    3.82          }
    3.83      }
    3.84 +    
    3.85 +    private static String mangleSig(String txt, int first, int last) {
    3.86 +        StringBuilder sb = new StringBuilder();
    3.87 +        for (int i = first; i < last; i++) {
    3.88 +            final char ch = txt.charAt(i);
    3.89 +            switch (ch) {
    3.90 +                case '/': sb.append('_'); break;
    3.91 +                case '_': sb.append("_1"); break;
    3.92 +                case ';': sb.append("_2"); break;
    3.93 +                case '[': sb.append("_3"); break;
    3.94 +                default: sb.append(ch); break;
    3.95 +            }
    3.96 +        }
    3.97 +        return sb.toString();
    3.98 +    }
    3.99  
   3.100 -    private String findMethodName(MethodData m, StringBuilder cnt) {
   3.101 +    private static String findMethodName(MethodData m, StringBuilder cnt) {
   3.102          StringBuilder name = new StringBuilder();
   3.103          if ("<init>".equals(m.getName())) { // NOI18N
   3.104              name.append("cons"); // NOI18N
   3.105 @@ -882,11 +894,11 @@
   3.106          } 
   3.107          
   3.108          boolean hasReturn[] = { false };
   3.109 -        countArgs(findDescriptor(m.getInternalSig()), hasReturn, name, cnt);
   3.110 +        countArgs(m.getInternalSig(), hasReturn, name, cnt);
   3.111          return name.toString();
   3.112      }
   3.113  
   3.114 -    private String findMethodName(String[] mi, StringBuilder cnt, boolean[] hasReturn) {
   3.115 +    static String findMethodName(String[] mi, StringBuilder cnt, boolean[] hasReturn) {
   3.116          StringBuilder name = new StringBuilder();
   3.117          String descr = mi[2];//mi.getDescriptor();
   3.118          String nm= mi[1];
   3.119 @@ -895,7 +907,7 @@
   3.120          } else {
   3.121              name.append(nm);
   3.122          }
   3.123 -        countArgs(findDescriptor(descr), hasReturn, name, cnt);
   3.124 +        countArgs(descr, hasReturn, name, cnt);
   3.125          return name.toString();
   3.126      }
   3.127  
   3.128 @@ -995,10 +1007,6 @@
   3.129          return s;
   3.130      }
   3.131  
   3.132 -    private String findDescriptor(String d) {
   3.133 -        return d.replace('[', 'A');
   3.134 -    }
   3.135 -
   3.136      private boolean javaScriptBody(String prefix, MethodData m, boolean isStatic) throws IOException {
   3.137          byte[] arr = m.findAnnotationData(true);
   3.138          if (arr == null) {
     4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java	Mon Dec 03 19:51:46 2012 +0100
     4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java	Tue Dec 04 09:16:53 2012 +0100
     4.3 @@ -29,7 +29,7 @@
     4.4   */
     4.5  public class ArrayTest {
     4.6      @Test public void verifySimpleIntOperation() throws Exception {
     4.7 -            assertExec("CheckTheSum", Array.class, "simpleI", 
     4.8 +            assertExec("CheckTheSum", Array.class, "simple__I", 
     4.9              Double.valueOf(15)
    4.10          );
    4.11      }
    4.12 @@ -39,13 +39,13 @@
    4.13      }
    4.14      
    4.15      @Test public void verifyOperationsOnArrays() throws Exception {
    4.16 -        assertExec("The sum is 105", Array.class, "sumD", 
    4.17 +        assertExec("The sum is 105", Array.class, "sum__D", 
    4.18              Double.valueOf(105)
    4.19          );
    4.20      }
    4.21      
    4.22      @Test public void doesCopyArrayWork() throws Exception {
    4.23 -        assertExec("Returns 'a'", Array.class, "copyArrayC", Double.valueOf('a'));
    4.24 +        assertExec("Returns 'a'", Array.class, "copyArray__C", Double.valueOf('a'));
    4.25      }
    4.26      
    4.27      private static CharSequence codeSeq;
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ByteCodeToJavaScriptTest.java	Tue Dec 04 09:16:53 2012 +0100
     5.3 @@ -0,0 +1,55 @@
     5.4 +/**
     5.5 + * Back 2 Browser Bytecode Translator
     5.6 + * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     5.7 + *
     5.8 + * This program is free software: you can redistribute it and/or modify
     5.9 + * it under the terms of the GNU General Public License as published by
    5.10 + * the Free Software Foundation, version 2 of the License.
    5.11 + *
    5.12 + * This program is distributed in the hope that it will be useful,
    5.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    5.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    5.15 + * GNU General Public License for more details.
    5.16 + *
    5.17 + * You should have received a copy of the GNU General Public License
    5.18 + * along with this program. Look for COPYING file in the top folder.
    5.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
    5.20 + */
    5.21 +package org.apidesign.vm4brwsr;
    5.22 +
    5.23 +import static org.testng.Assert.*;
    5.24 +import org.testng.annotations.Test;
    5.25 +
    5.26 +/**
    5.27 + *
    5.28 + * @author Jaroslav Tulach <jtulach@netbeans.org>
    5.29 + */
    5.30 +public class ByteCodeToJavaScriptTest {
    5.31 +    
    5.32 +    public ByteCodeToJavaScriptTest() {
    5.33 +    }
    5.34 +
    5.35 +    @Test
    5.36 +    public void findMethodNameManglesObjectsCorrectly() {
    5.37 +        StringBuilder cnt = new StringBuilder();
    5.38 +        boolean[] hasReturn = { false };
    5.39 +        String ret = ByteCodeToJavaScript.findMethodName(new String[] { 
    5.40 +            "StringTest", "replace", "(Ljava/lang/String;CC)Ljava/lang/String;"
    5.41 +        }, cnt, hasReturn);
    5.42 +        assertEquals(cnt.toString(), "000", "No doubles or longs");
    5.43 +        assertTrue(hasReturn[0], "Returns string");
    5.44 +        assertEquals(ret, "replace__Ljava_lang_String_2Ljava_lang_String_2CC");
    5.45 +    }
    5.46 +
    5.47 +    @Test
    5.48 +    public void manglingArrays() {
    5.49 +        StringBuilder cnt = new StringBuilder();
    5.50 +        boolean[] hasReturn = { false };
    5.51 +        String ret = ByteCodeToJavaScript.findMethodName(new String[] { 
    5.52 +            "VMinVM", "toJavaScript", "([B)Ljava/lang/String;"
    5.53 +        }, cnt, hasReturn);
    5.54 +        assertEquals(cnt.toString(), "0", "No doubles or longs");
    5.55 +        assertTrue(hasReturn[0], "Returns string");
    5.56 +        assertEquals(ret, "toJavaScript__Ljava_lang_String_2_3B");
    5.57 +    }
    5.58 +}
     6.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Mon Dec 03 19:51:46 2012 +0100
     6.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Tue Dec 04 09:16:53 2012 +0100
     6.3 @@ -29,42 +29,42 @@
     6.4      @Test public void verifyDefaultDoubleValue() throws Exception {
     6.5          assertExec(
     6.6              "Will be zero",
     6.7 -            Instance.class, "defaultDblValueD",
     6.8 +            Instance.class, "defaultDblValue__D",
     6.9              Double.valueOf(0)
    6.10          );
    6.11      }
    6.12      @Test public void verifyStaticMethodCall() throws Exception {
    6.13          assertExec(
    6.14              "Will be zero",
    6.15 -            InstanceSub.class, "recallDblD",
    6.16 +            InstanceSub.class, "recallDbl__D",
    6.17              Double.valueOf(0)
    6.18          );
    6.19      }
    6.20      @Test public void verifyAssignedByteValue() throws Exception {
    6.21          assertExec(
    6.22              "Will one thirty one",
    6.23 -            Instance.class, "assignedByteValueB",
    6.24 +            Instance.class, "assignedByteValue__B",
    6.25              Double.valueOf(31)
    6.26          );
    6.27      }
    6.28      @Test public void verifyMagicOne() throws Exception {
    6.29          assertExec(
    6.30              "Should be three and something",
    6.31 -            Instance.class, "magicOneD",
    6.32 +            Instance.class, "magicOne__D",
    6.33              Double.valueOf(3.3)
    6.34          );
    6.35      }
    6.36      @Test public void verifyInstanceMethods() throws Exception {
    6.37          assertExec(
    6.38              "Should be eleven as we invoke overwritten method, plus 44",
    6.39 -            Instance.class, "virtualBytesI",
    6.40 +            Instance.class, "virtualBytes__I",
    6.41              Double.valueOf(55)
    6.42          );
    6.43      }
    6.44      @Test public void verifyInterfaceMethods() throws Exception {
    6.45          assertExec(
    6.46              "Retruns default value",
    6.47 -            Instance.class, "interfaceBytesF",
    6.48 +            Instance.class, "interfaceBytes__F",
    6.49              Double.valueOf(31)
    6.50          );
    6.51      }
    6.52 @@ -72,7 +72,7 @@
    6.53      @Test public void isNull() throws Exception {
    6.54          assertExec(
    6.55              "Yes, we are instance",
    6.56 -            Instance.class, "isNullZ",
    6.57 +            Instance.class, "isNull__Z",
    6.58              Double.valueOf(0.0)
    6.59          );
    6.60      }
    6.61 @@ -80,7 +80,7 @@
    6.62      @Test public void isInstanceOf() throws Exception {
    6.63          assertExec(
    6.64              "Yes, we are instance",
    6.65 -            Instance.class, "instanceOfZZ",
    6.66 +            Instance.class, "instanceOf__ZZ",
    6.67              Double.valueOf(1.0), true
    6.68          );
    6.69      }
    6.70 @@ -88,7 +88,7 @@
    6.71      @Test public void notInstanceOf() throws Exception {
    6.72          assertExec(
    6.73              "No, we are not an instance",
    6.74 -            Instance.class, "instanceOfZZ",
    6.75 +            Instance.class, "instanceOf__ZZ",
    6.76              Double.valueOf(0.0), false
    6.77          );
    6.78      }
    6.79 @@ -96,14 +96,14 @@
    6.80      @Test public void verifyCastToClass() throws Exception {
    6.81          assertExec(
    6.82              "Five signals all is good",
    6.83 -            Instance.class, "castsWorkIZ",
    6.84 +            Instance.class, "castsWork__IZ",
    6.85              Double.valueOf(5.0), false
    6.86          );
    6.87      }
    6.88      @Test public void verifyCastToInterface() throws Exception {
    6.89          assertExec(
    6.90              "Five signals all is good",
    6.91 -            Instance.class, "castsWorkIZ",
    6.92 +            Instance.class, "castsWork__IZ",
    6.93              Double.valueOf(5.0), true
    6.94          );
    6.95      }
    6.96 @@ -111,7 +111,7 @@
    6.97      @Test public void sharedConstructor() throws Exception {
    6.98          assertExec(
    6.99              "Constructor of first and 2nd instance should be the same",
   6.100 -            Instance.class, "sharedConstructorZ",
   6.101 +            Instance.class, "sharedConstructor__Z",
   6.102              Double.valueOf(1.0)
   6.103          );
   6.104      }
   6.105 @@ -119,7 +119,7 @@
   6.106      @Test public void differentConstructor() throws Exception {
   6.107          assertExec(
   6.108              "Constructor of X and Y should be the different",
   6.109 -            Instance.class, "differentConstructorZ",
   6.110 +            Instance.class, "differentConstructor__Z",
   6.111              Double.valueOf(0)
   6.112          );
   6.113      }
   6.114 @@ -127,7 +127,7 @@
   6.115      @Test public void jsObjectIsLikeJavaObject() throws Exception {
   6.116          assertExec(
   6.117              "JavaScript object is instance of Java Object",
   6.118 -            Instance.class, "iofObjectZ",
   6.119 +            Instance.class, "iofObject__Z",
   6.120              Double.valueOf(1)
   6.121          );
   6.122      }
     7.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Mon Dec 03 19:51:46 2012 +0100
     7.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Tue Dec 04 09:16:53 2012 +0100
     7.3 @@ -29,19 +29,19 @@
     7.4   */
     7.5  public class NumberTest {
     7.6      @Test public void integerFromString() throws Exception {
     7.7 -        assertExec("Can convert string to integer", Integer.class, "parseIntILjava_lang_String",
     7.8 +        assertExec("Can convert string to integer", Integer.class, "parseInt__ILjava_lang_String_2",
     7.9              Double.valueOf(333), "333"
    7.10          );
    7.11      }
    7.12  
    7.13      @Test public void doubleFromString() throws Exception {
    7.14 -        assertExec("Can convert string to double", Double.class, "parseDoubleDLjava_lang_String",
    7.15 +        assertExec("Can convert string to double", Double.class, "parseDouble__DLjava_lang_String_2",
    7.16              Double.valueOf(33.3), "33.3"
    7.17          );
    7.18      }
    7.19  
    7.20      @Test public void autoboxDouble() throws Exception {
    7.21 -        assertExec("Autoboxing of doubles is OK", Numbers.class, "autoboxDblToStringLjava_lang_String",
    7.22 +        assertExec("Autoboxing of doubles is OK", Numbers.class, "autoboxDblToString__Ljava_lang_String_2",
    7.23              "3.3"
    7.24          );
    7.25      }
    7.26 @@ -51,7 +51,7 @@
    7.27      }
    7.28  
    7.29      @Test public void jslog1000() throws Exception {
    7.30 -        assertExec("log_10(1000) == 3", Math.class, "log10DD", 
    7.31 +        assertExec("log_10(1000) == 3", Math.class, "log10__DD", 
    7.32              Double.valueOf(3.0), 1000.0
    7.33          );
    7.34      }
    7.35 @@ -60,20 +60,20 @@
    7.36          assertEquals(3, Numbers.rem(303, 10));
    7.37      }
    7.38      @Test public void jsRem() throws Exception {
    7.39 -        assertExec("Should be three", Numbers.class, "remIII", 
    7.40 +        assertExec("Should be three", Numbers.class, "rem__III", 
    7.41              Double.valueOf(3.0), 303, 10
    7.42          );
    7.43      }
    7.44      
    7.45      @Test public void deserializeInt() throws Exception {
    7.46          int exp = Numbers.deserInt();
    7.47 -        assertExec("Should be the same", Numbers.class, "deserIntI", 
    7.48 +        assertExec("Should be the same", Numbers.class, "deserInt__I", 
    7.49              Double.valueOf(exp)
    7.50          );
    7.51      }
    7.52  
    7.53      @Test public void deserializeSimpleLong() throws Exception {
    7.54 -        assertExec("Should be 3454", Numbers.class, "deserLongJAB", 
    7.55 +        assertExec("Should be 3454", Numbers.class, "deserLong__J_3B", 
    7.56              Double.valueOf(3454), 
    7.57              new byte[] { (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)13, (byte)126 }
    7.58          );
    7.59 @@ -84,7 +84,7 @@
    7.60              (byte)64, (byte)8, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0
    7.61          };
    7.62          long exp = Numbers.deserLong(arr);
    7.63 -        assertExec("Should be " + exp, "org_apidesign_vm4brwsr_Numbers_deserLongJAB", 
    7.64 +        assertExec("Should be " + exp, "org_apidesign_vm4brwsr_Numbers_deserLong__JAB", 
    7.65              Double.valueOf(exp), arr);
    7.66      }
    7.67      */
    7.68 @@ -97,7 +97,7 @@
    7.69      
    7.70      @Test public void deserializeFloatInJS() throws Exception {
    7.71          float f = 54324.32423f;
    7.72 -        assertExec("Should be the same", Numbers.class, "deserFloatF", 
    7.73 +        assertExec("Should be the same", Numbers.class, "deserFloat__F", 
    7.74              Double.valueOf(f)
    7.75          );
    7.76      }
    7.77 @@ -110,7 +110,7 @@
    7.78      
    7.79      @Test public void deserializeDoubleInJS() throws Exception {
    7.80          double f = 3.0;
    7.81 -        assertExec("Should be the same", Numbers.class, "deserDoubleD", f);
    7.82 +        assertExec("Should be the same", Numbers.class, "deserDouble__D", f);
    7.83      }
    7.84      /*
    7.85      @Test public void serDouble() throws IOException {
    7.86 @@ -131,7 +131,7 @@
    7.87      @Test public void fiveInStringJS() throws Exception {
    7.88          String s = Numbers.intToString();
    7.89          assertExec("Should be the same: " + s, 
    7.90 -            Numbers.class, "intToStringLjava_lang_String", 
    7.91 +            Numbers.class, "intToString__Ljava_lang_String_2", 
    7.92              s
    7.93          );
    7.94      }
    7.95 @@ -139,7 +139,7 @@
    7.96      @Test public void sevenInStringJS() throws Exception {
    7.97          String s = Numbers.floatToString();
    7.98          assertExec("Should be the same: " + s, 
    7.99 -            Numbers.class, "floatToStringLjava_lang_String", 
   7.100 +            Numbers.class, "floatToString__Ljava_lang_String_2", 
   7.101              s
   7.102          );
   7.103      }
     8.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Mon Dec 03 19:51:46 2012 +0100
     8.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Tue Dec 04 09:16:53 2012 +0100
     8.3 @@ -36,7 +36,7 @@
     8.4      @Test public void threePlusFour() throws Exception {
     8.5          assertExec(
     8.6              "Should be seven", 
     8.7 -            StaticMethod.class, "sumIII", 
     8.8 +            StaticMethod.class, "sum__III", 
     8.9              Double.valueOf(7), 
    8.10              3, 4
    8.11          );
    8.12 @@ -45,7 +45,7 @@
    8.13      @Test public void checkReallyInitializedValues() throws Exception {
    8.14          assertExec(
    8.15              "Return true", 
    8.16 -            StaticMethod.class, "isNullZ", 
    8.17 +            StaticMethod.class, "isNull__Z", 
    8.18              Double.valueOf(1)
    8.19          );
    8.20      }
    8.21 @@ -53,7 +53,7 @@
    8.22      @Test public void powerOfThree() throws Exception {
    8.23          assertExec(
    8.24              "Should be nine", 
    8.25 -            StaticMethod.class, "powerFF", 
    8.26 +            StaticMethod.class, "power__FF", 
    8.27              Double.valueOf(9),
    8.28              3.0f
    8.29          );
    8.30 @@ -62,7 +62,7 @@
    8.31      @Test public void minusOne() throws Exception {
    8.32          assertExec(
    8.33              "Should be minus one", 
    8.34 -            StaticMethod.class, "minusOneI", 
    8.35 +            StaticMethod.class, "minusOne__I", 
    8.36              Double.valueOf(-1)
    8.37          );
    8.38      }
    8.39 @@ -70,7 +70,7 @@
    8.40      @Test public void doubleWithoutLong() throws Exception {
    8.41          assertExec(
    8.42              "Should be two",
    8.43 -            StaticMethod.class, "minusDDJ", 
    8.44 +            StaticMethod.class, "minus__DDJ", 
    8.45              Double.valueOf(2),
    8.46              3.0d, 1l
    8.47          );
    8.48 @@ -79,7 +79,7 @@
    8.49      @Test public void divAndRound() throws Exception {
    8.50          assertExec(
    8.51              "Should be rounded to one",
    8.52 -            StaticMethod.class, "divIBD", 
    8.53 +            StaticMethod.class, "div__IBD", 
    8.54              Double.valueOf(1),
    8.55              3, 3.75
    8.56          );
    8.57 @@ -87,7 +87,7 @@
    8.58      @Test public void mixedMethodFourParams() throws Exception {
    8.59          assertExec(
    8.60              "Should be two",
    8.61 -            StaticMethod.class, "mixIIJBD", 
    8.62 +            StaticMethod.class, "mix__IIJBD", 
    8.63              Double.valueOf(20),
    8.64              2, 10l, 5, 2.0
    8.65          );
    8.66 @@ -95,7 +95,7 @@
    8.67      @Test public void factRec() throws Exception {
    8.68          assertExec(
    8.69              "Factorial of 5 is 120",
    8.70 -            StaticMethod.class, "factRecJI", 
    8.71 +            StaticMethod.class, "factRec__JI", 
    8.72              Double.valueOf(120),
    8.73              5
    8.74          );
    8.75 @@ -103,7 +103,7 @@
    8.76      @Test public void factIter() throws Exception {
    8.77          assertExec(
    8.78              "Factorial of 5 is 120",
    8.79 -            StaticMethod.class, "factIterJI", 
    8.80 +            StaticMethod.class, "factIter__JI", 
    8.81              Double.valueOf(120),
    8.82              5
    8.83          );
    8.84 @@ -112,7 +112,7 @@
    8.85      @Test public void xor() throws Exception {
    8.86          assertExec(
    8.87              "Xor is 4",
    8.88 -            StaticMethod.class, "xorJIJ",
    8.89 +            StaticMethod.class, "xor__JIJ",
    8.90              Double.valueOf(4),
    8.91              7,
    8.92              3
    8.93 @@ -122,7 +122,7 @@
    8.94      @Test public void or() throws Exception {
    8.95          assertExec(
    8.96              "Or will be 7",
    8.97 -            StaticMethod.class, "orOrAndJZII",
    8.98 +            StaticMethod.class, "orOrAnd__JZII",
    8.99              Double.valueOf(7),
   8.100              true,
   8.101              4,
   8.102 @@ -132,14 +132,14 @@
   8.103      @Test public void nullCheck() throws Exception {
   8.104          assertExec(
   8.105              "Returns nothing",
   8.106 -            StaticMethod.class, "noneLjava_lang_ObjectII",
   8.107 +            StaticMethod.class, "none__Ljava_lang_Object_2II",
   8.108              null, 1, 3
   8.109          );
   8.110      }
   8.111      @Test public void and() throws Exception {
   8.112          assertExec(
   8.113              "And will be 3",
   8.114 -            StaticMethod.class, "orOrAndJZII",
   8.115 +            StaticMethod.class, "orOrAnd__JZII",
   8.116              Double.valueOf(3),
   8.117              false,
   8.118              7,
   8.119 @@ -149,7 +149,7 @@
   8.120      @Test public void inc4() throws Exception {
   8.121          assertExec(
   8.122              "It will be 4",
   8.123 -            StaticMethod.class, "inc4I",
   8.124 +            StaticMethod.class, "inc4__I",
   8.125              Double.valueOf(4)
   8.126          );
   8.127      }
   8.128 @@ -162,7 +162,7 @@
   8.129      @Test public void shiftLeftInJS() throws Exception {
   8.130          assertExec(
   8.131              "Setting 9th bit",
   8.132 -            StaticMethod.class, "shiftLeftIII",
   8.133 +            StaticMethod.class, "shiftLeft__III",
   8.134              Double.valueOf(256),
   8.135              1, 8
   8.136          );
   8.137 @@ -176,7 +176,7 @@
   8.138      @Test public void shiftRightInJS() throws Exception {
   8.139          assertExec(
   8.140              "Get -1",
   8.141 -            StaticMethod.class, "shiftArithmRightIIIZ",
   8.142 +            StaticMethod.class, "shiftArithmRight__IIIZ",
   8.143              Double.valueOf(-1),
   8.144              -8, 3, true
   8.145          );
   8.146 @@ -189,7 +189,7 @@
   8.147      @Test public void unsignedShiftRightInJS() throws Exception {
   8.148          assertExec(
   8.149              "Get -1",
   8.150 -            StaticMethod.class, "shiftArithmRightIIIZ",
   8.151 +            StaticMethod.class, "shiftArithmRight__IIIZ",
   8.152              Double.valueOf(1),
   8.153              8, 3, false
   8.154          );
   8.155 @@ -198,7 +198,7 @@
   8.156      @Test public void javaScriptBody() throws Exception {
   8.157          assertExec(
   8.158              "JavaScript string",
   8.159 -            StaticMethod.class, "i2sLjava_lang_StringII",
   8.160 +            StaticMethod.class, "i2s__Ljava_lang_String_2II",
   8.161              "333",
   8.162              330, 3
   8.163          );
   8.164 @@ -207,7 +207,7 @@
   8.165      @Test public void switchJarda() throws Exception {
   8.166          assertExec(
   8.167              "The expected value",
   8.168 -            StaticMethod.class, "swtchLjava_lang_StringI",
   8.169 +            StaticMethod.class, "swtch__Ljava_lang_String_2I",
   8.170              "Jarda",
   8.171              0
   8.172          );
   8.173 @@ -216,7 +216,7 @@
   8.174      @Test public void switchDarda() throws Exception {
   8.175          assertExec(
   8.176              "The expected value",
   8.177 -            StaticMethod.class, "swtchLjava_lang_StringI",
   8.178 +            StaticMethod.class, "swtch__Ljava_lang_String_2I",
   8.179              "Darda",
   8.180              1
   8.181          );
   8.182 @@ -224,7 +224,7 @@
   8.183      @Test public void switchParda() throws Exception {
   8.184          assertExec(
   8.185              "The expected value",
   8.186 -            StaticMethod.class, "swtch2Ljava_lang_StringI",
   8.187 +            StaticMethod.class, "swtch2__Ljava_lang_String_2I",
   8.188              "Parda",
   8.189              22
   8.190          );
   8.191 @@ -232,7 +232,7 @@
   8.192      @Test public void switchMarda() throws Exception {
   8.193          assertExec(
   8.194              "The expected value",
   8.195 -            StaticMethod.class, "swtchLjava_lang_StringI",
   8.196 +            StaticMethod.class, "swtch__Ljava_lang_String_2I",
   8.197              "Marda",
   8.198              -433
   8.199          );
     9.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Mon Dec 03 19:51:46 2012 +0100
     9.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Tue Dec 04 09:16:53 2012 +0100
     9.3 @@ -18,7 +18,6 @@
     9.4  package org.apidesign.vm4brwsr;
     9.5  
     9.6  import javax.script.Invocable;
     9.7 -import javax.script.ScriptException;
     9.8  import org.testng.annotations.Test;
     9.9  import static org.testng.Assert.*;
    9.10  import org.testng.annotations.BeforeClass;
    9.11 @@ -31,7 +30,7 @@
    9.12      @Test public void firstChar() throws Exception {
    9.13          assertExec(
    9.14              "First char in Hello is H",
    9.15 -            StringSample.class, "sayHelloCI",
    9.16 +            StringSample.class, "sayHello__CI",
    9.17              72, 0
    9.18          );
    9.19      }
    9.20 @@ -39,7 +38,7 @@
    9.21      @Test public void fromChars() throws Exception {
    9.22          assertExec(
    9.23              "First char in Hello is ABC",
    9.24 -            StringSample.class, "fromCharsLjava_lang_StringCCC",
    9.25 +            StringSample.class, "fromChars__Ljava_lang_String_2CCC",
    9.26              "ABC", 'A', 'B', 'C'
    9.27          );
    9.28      }
    9.29 @@ -47,7 +46,7 @@
    9.30      @Test public void concatChars() throws Exception {
    9.31          assertExec(
    9.32              "Composing yields ABC",
    9.33 -            StringSample.class, "charsLjava_lang_StringCCC",
    9.34 +            StringSample.class, "chars__Ljava_lang_String_2CCC",
    9.35              "ABC", 'A', 'B', 'C'
    9.36          );
    9.37      }
    9.38 @@ -55,7 +54,7 @@
    9.39      @Test public void concatCharsFromInts() throws Exception {
    9.40          assertExec(
    9.41              "Composing yields ABC",
    9.42 -            StringSample.class, "charsFromNumbersLjava_lang_String",
    9.43 +            StringSample.class, "charsFromNumbers__Ljava_lang_String_2",
    9.44              "ABC"
    9.45          );
    9.46      }
    9.47 @@ -63,7 +62,7 @@
    9.48      @Test public void concatCharsFromChars() throws Exception {
    9.49          assertExec(
    9.50              "Composing yields ABC",
    9.51 -            StringSample.class, "charsFromCharsLjava_lang_String",
    9.52 +            StringSample.class, "charsFromChars__Ljava_lang_String_2",
    9.53              "ABC"
    9.54          );
    9.55      }
    9.56 @@ -71,7 +70,7 @@
    9.57      @Test public void instanceOfWorks() throws Exception {
    9.58          assertExec(
    9.59              "It is string",
    9.60 -            StringSample.class, "isStringInstanceZ",
    9.61 +            StringSample.class, "isStringInstance__Z",
    9.62              Double.valueOf(1.0)
    9.63          );
    9.64      }
    9.65 @@ -79,7 +78,7 @@
    9.66      @Test(timeOut=10000) public void toStringConcatenation() throws Exception {
    9.67          assertExec(
    9.68              "Five executions should generate 5Hello World!",
    9.69 -            StringSample.class, "toStringTestLjava_lang_StringI",
    9.70 +            StringSample.class, "toStringTest__Ljava_lang_String_2I",
    9.71              "Hello World!5", 5
    9.72          );
    9.73      }
    9.74 @@ -90,7 +89,7 @@
    9.75      @Test(timeOut=10000) public void stringStringConcat() throws Exception {
    9.76          assertExec(
    9.77              "Composes strings OK",
    9.78 -            StringSample.class, "concatStringsLjava_lang_String",
    9.79 +            StringSample.class, "concatStrings__Ljava_lang_String_2",
    9.80              "Hello World!1" + "\\\n\r\t"
    9.81          );
    9.82      }
    9.83 @@ -98,21 +97,21 @@
    9.84      @Test public void equalsAndSubstring() throws Exception {
    9.85          assertExec(
    9.86              "Composes are OK",
    9.87 -            StringSample.class, "equalToHelloZII",
    9.88 +            StringSample.class, "equalToHello__ZII",
    9.89              true, 0, 5
    9.90          );
    9.91      }
    9.92      @Test public void replaceChars() throws Exception {
    9.93          assertExec(
    9.94              "Can replace slashes by underscores",
    9.95 -            StringSample.class, "replaceLjava_lang_StringLjava_lang_StringCC",
    9.96 +            StringSample.class, "replace__Ljava_lang_String_2Ljava_lang_String_2CC",
    9.97              "x_y_z", "x/y/z", '/', '_'
    9.98          );
    9.99      }
   9.100      @Test public void replaceIntChars() throws Exception {
   9.101          assertExec(
   9.102              "Can replace slashes by underscores",
   9.103 -            StringSample.class, "replaceLjava_lang_StringLjava_lang_StringCC",
   9.104 +            StringSample.class, "replace__Ljava_lang_String_2Ljava_lang_String_2CC",
   9.105              "x_y_z", "x/y/z", (int)'/', (int)'_'
   9.106          );
   9.107      }
   9.108 @@ -120,7 +119,7 @@
   9.109      @Test public void insertBuilder() throws Exception {
   9.110          assertExec(
   9.111              "Can insert something into a buffer?",
   9.112 -            StringSample.class, "insertBufferLjava_lang_String",
   9.113 +            StringSample.class, "insertBuffer__Ljava_lang_String_2",
   9.114              "Ahojdo!"
   9.115          );
   9.116      }
   9.117 @@ -130,7 +129,7 @@
   9.118          int jh = StringSample.hashCode(j);
   9.119          assertExec(
   9.120              "Hashcode is the same " +jh,
   9.121 -            StringSample.class, "hashCodeILjava_lang_String",
   9.122 +            StringSample.class, "hashCode__ILjava_lang_String_2",
   9.123              Double.valueOf(jh), j
   9.124          );
   9.125      }
   9.126 @@ -139,28 +138,28 @@
   9.127          int jh = StringSample.hashCode(j);
   9.128          assertExec(
   9.129              "Hashcode is the same " + jh,
   9.130 -            StringSample.class, "hashCodeILjava_lang_String",
   9.131 +            StringSample.class, "hashCode__ILjava_lang_String_2",
   9.132              Double.valueOf(jh), j
   9.133          );
   9.134      }
   9.135      @Test public void stringSwitch1() throws Exception {
   9.136          assertExec(
   9.137              "Get one",
   9.138 -            StringSample.class, "stringSwitchILjava_lang_String",
   9.139 +            StringSample.class, "stringSwitch__ILjava_lang_String_2",
   9.140              Double.valueOf(1), "jedna"
   9.141          );
   9.142      }
   9.143      @Test public void stringSwitch2() throws Exception {
   9.144          assertExec(
   9.145              "Get two",
   9.146 -            StringSample.class, "stringSwitchILjava_lang_String",
   9.147 +            StringSample.class, "stringSwitch__ILjava_lang_String_2",
   9.148              Double.valueOf(2), "dve"
   9.149          );
   9.150      }
   9.151      @Test public void stringSwitchDefault() throws Exception {
   9.152          assertExec(
   9.153              "Get -1",
   9.154 -            StringSample.class, "stringSwitchILjava_lang_String",
   9.155 +            StringSample.class, "stringSwitch__ILjava_lang_String_2",
   9.156              Double.valueOf(-1), "none"
   9.157          );
   9.158      }
   9.159 @@ -169,7 +168,7 @@
   9.160          assertEquals(StringSample.countAB("Ahoj Bedo!"), 3, "Verify Java code is sane");
   9.161          assertExec(
   9.162              "One A and one B adds to 3",
   9.163 -            StringSample.class, "countABILjava_lang_String",
   9.164 +            StringSample.class, "countAB__ILjava_lang_String_2",
   9.165              Double.valueOf(3), "Ahoj Bedo!"
   9.166          );
   9.167          
    10.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java	Mon Dec 03 19:51:46 2012 +0100
    10.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java	Tue Dec 04 09:16:53 2012 +0100
    10.3 @@ -43,7 +43,7 @@
    10.4  
    10.5      @JavaScriptBody(args = { "self", "n" }, 
    10.6          body=
    10.7 -          "var cls = n.replaceLjava_lang_StringCC(n,'/','_').toString();"
    10.8 +          "var cls = n.replace__Ljava_lang_String_2CC(n,'/','_').toString();"
    10.9          + "var glb = self.fld_global;"
   10.10          + "var vm = self.fld_vm;"
   10.11          + "if (glb[cls]) return false;"
    11.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java	Mon Dec 03 19:51:46 2012 +0100
    11.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java	Tue Dec 04 09:16:53 2012 +0100
    11.3 @@ -53,7 +53,7 @@
    11.4          sb.append("\n  var glb = global;");
    11.5          sb.append("\n  lazyVM.prototype.loadClass = function(res, name) {");
    11.6          sb.append("\n    var script = org_apidesign_vm4brwsr_VMLazy(true)."
    11.7 -            + "toJavaScriptLjava_lang_StringLjava_lang_ObjectLjava_lang_ObjectAB("
    11.8 +            + "toJavaScript__Ljava_lang_String_2Ljava_lang_Object_2Ljava_lang_Object_2_3B("
    11.9              + "  glb, self,"
   11.10              + "  loader.get(res + '.class')"
   11.11              + ");");
   11.12 @@ -77,13 +77,13 @@
   11.13      
   11.14      @Test public void invokeStaticMethod() throws Exception {
   11.15          assertExec("Trying to get -1", "test", Double.valueOf(-1),
   11.16 -            "org/apidesign/vm4brwsr/StaticMethod", "org_apidesign_vm4brwsr_StaticMethod", "minusOneI"
   11.17 +            "org/apidesign/vm4brwsr/StaticMethod", "org_apidesign_vm4brwsr_StaticMethod", "minusOne__I"
   11.18          );
   11.19      }
   11.20  
   11.21      @Test public void loadDependantClass() throws Exception {
   11.22          assertExec("Trying to get zero", "test", Double.valueOf(0),
   11.23 -            "org/apidesign/vm4brwsr/InstanceSub", "org_apidesign_vm4brwsr_InstanceSub", "recallDblD"
   11.24 +            "org/apidesign/vm4brwsr/InstanceSub", "org_apidesign_vm4brwsr_InstanceSub", "recallDbl__D"
   11.25          );
   11.26      }
   11.27  
    12.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java	Mon Dec 03 19:51:46 2012 +0100
    12.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java	Tue Dec 04 09:16:53 2012 +0100
    12.3 @@ -42,7 +42,7 @@
    12.4          Object ret;
    12.5          try {
    12.6              ret = code.invokeFunction(VMinVM.class.getName().replace('.', '_'), true);
    12.7 -            ret = code.invokeMethod(ret, "toJavaScriptLjava_lang_StringAB", arr);
    12.8 +            ret = code.invokeMethod(ret, "toJavaScript__Ljava_lang_String_2_3B", arr);
    12.9          } catch (Exception ex) {
   12.10              File f = File.createTempFile("execution", ".js");
   12.11              FileWriter w = new FileWriter(f);