emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java
changeset 418 c0bbf144c2c6
parent 392 44a5802816be
child 420 3497ecd097df
     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  }