1.1 --- a/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java Fri Dec 28 12:35:32 2012 +0100
1.2 +++ b/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java Tue Jan 08 16:01:25 2013 +0100
1.3 @@ -25,6 +25,7 @@
1.4 package org.apidesign.bck2brwsr.emul;
1.5
1.6 import java.lang.reflect.Method;
1.7 +import java.util.Enumeration;
1.8 import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.9
1.10 /** Utilities to work on methods.
1.11 @@ -96,5 +97,56 @@
1.12 }
1.13 return arr;
1.14 }
1.15 +
1.16 + public static int signatureElements(String sig) {
1.17 + Enumeration<Class> en = signatureParser(sig);
1.18 + int cnt = 0;
1.19 + while (en.hasMoreElements()) {
1.20 + en.nextElement();
1.21 + cnt++;
1.22 + }
1.23 + return cnt;
1.24 + }
1.25
1.26 + public static Enumeration<Class> signatureParser(final String sig) {
1.27 + class E implements Enumeration<Class> {
1.28 + int pos;
1.29 +
1.30 + public boolean hasMoreElements() {
1.31 + return pos < sig.length();
1.32 + }
1.33 +
1.34 + public Class nextElement() {
1.35 + switch (sig.charAt(pos++)) {
1.36 + case 'I':
1.37 + return Integer.TYPE;
1.38 + case 'J':
1.39 + return Long.TYPE;
1.40 + case 'D':
1.41 + return Double.TYPE;
1.42 + case 'F':
1.43 + return Float.TYPE;
1.44 + case 'B':
1.45 + return Byte.TYPE;
1.46 + case 'Z':
1.47 + return Boolean.TYPE;
1.48 + case 'S':
1.49 + return Short.TYPE;
1.50 + case 'V':
1.51 + return Void.TYPE;
1.52 + case 'L':
1.53 + try {
1.54 + int up = sig.indexOf("_2");
1.55 + String type = sig.substring(1, up);
1.56 + pos = up + 2;
1.57 + return Class.forName(type);
1.58 + } catch (ClassNotFoundException ex) {
1.59 + // should not happen
1.60 + }
1.61 + }
1.62 + throw new UnsupportedOperationException(sig + " at " + pos);
1.63 + }
1.64 + }
1.65 + return new E();
1.66 + }
1.67 }