emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java
branchemul
changeset 666 8338ab1991e6
parent 604 3fcc279c921b
parent 654 26a86cc00224
     1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java	Mon Jan 28 18:15:21 2013 +0100
     1.2 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java	Tue Feb 05 08:27:42 2013 +0100
     1.3 @@ -17,6 +17,7 @@
     1.4   */
     1.5  package org.apidesign.bck2brwsr.emul.reflect;
     1.6  
     1.7 +import java.lang.reflect.Array;
     1.8  import java.lang.reflect.Method;
     1.9  import java.util.Enumeration;
    1.10  import org.apidesign.bck2brwsr.core.JavaScriptBody;
    1.11 @@ -34,7 +35,7 @@
    1.12              throw new IllegalStateException(ex);
    1.13          }
    1.14      }
    1.15 -    
    1.16 +
    1.17      protected abstract Method create(Class<?> declaringClass, String name, Object data, String sig);
    1.18      
    1.19      
    1.20 @@ -48,8 +49,10 @@
    1.21          + "var arr = new Array();\n"
    1.22          + "for (m in c) {\n"
    1.23          + "  if (m.indexOf(prefix) === 0) {\n"
    1.24 +        + "     if (!c[m].cls) continue;\n"
    1.25          + "     arr.push(m);\n"
    1.26          + "     arr.push(c[m]);\n"
    1.27 +        + "     arr.push(c[m].cls.$class);\n"
    1.28          + "  }"
    1.29          + "}\n"
    1.30          + "return arr;")
    1.31 @@ -59,9 +62,10 @@
    1.32      public static Method findMethod(
    1.33          Class<?> clazz, String name, Class<?>... parameterTypes) {
    1.34          Object[] data = findMethodData(clazz, name + "__");
    1.35 -        BIG: for (int i = 0; i < data.length; i += 2) {
    1.36 -            String sig = ((String) data[0]).substring(name.length() + 2);
    1.37 -            Method tmp = INSTANCE.create(clazz, name, data[1], sig);
    1.38 +        BIG: for (int i = 0; i < data.length; i += 3) {
    1.39 +            String sig = ((String) data[i]).substring(name.length() + 2);
    1.40 +            Class<?> cls = (Class<?>) data[i + 2];
    1.41 +            Method tmp = INSTANCE.create(cls, name, data[i + 1], sig);
    1.42              Class<?>[] tmpParms = tmp.getParameterTypes();
    1.43              if (parameterTypes.length != tmpParms.length) {
    1.44                  continue;
    1.45 @@ -79,7 +83,7 @@
    1.46      public static Method[] findMethods(Class<?> clazz, int mask) {
    1.47          Object[] namesAndData = findMethodData(clazz, "");
    1.48          int cnt = 0;
    1.49 -        for (int i = 0; i < namesAndData.length; i += 2) {
    1.50 +        for (int i = 0; i < namesAndData.length; i += 3) {
    1.51              String sig = (String) namesAndData[i];
    1.52              Object data = namesAndData[i + 1];
    1.53              int middle = sig.indexOf("__");
    1.54 @@ -88,7 +92,8 @@
    1.55              }
    1.56              String name = sig.substring(0, middle);
    1.57              sig = sig.substring(middle + 2);
    1.58 -            final Method m = INSTANCE.create(clazz, name, data, sig);
    1.59 +            Class<?> cls = (Class<?>) namesAndData[i + 2];
    1.60 +            final Method m = INSTANCE.create(cls, name, data, sig);
    1.61              if ((m.getModifiers() & mask) == 0) {
    1.62                  continue;
    1.63              }
    1.64 @@ -100,6 +105,62 @@
    1.65          }
    1.66          return arr;
    1.67      }
    1.68 +    static String toSignature(Method m) {
    1.69 +        StringBuilder sb = new StringBuilder();
    1.70 +        sb.append(m.getName()).append("__");
    1.71 +        appendType(sb, m.getReturnType());
    1.72 +        Class<?>[] arr = m.getParameterTypes();
    1.73 +        for (int i = 0; i < arr.length; i++) {
    1.74 +            appendType(sb, arr[i]);
    1.75 +        }
    1.76 +        return sb.toString();
    1.77 +    }
    1.78 +    
    1.79 +    private static void appendType(StringBuilder sb, Class<?> type) {
    1.80 +        if (type == Integer.TYPE) {
    1.81 +            sb.append('I');
    1.82 +            return;
    1.83 +        }
    1.84 +        if (type == Long.TYPE) {
    1.85 +            sb.append('J');
    1.86 +            return;
    1.87 +        }
    1.88 +        if (type == Double.TYPE) {
    1.89 +            sb.append('D');
    1.90 +            return;
    1.91 +        }
    1.92 +        if (type == Float.TYPE) {
    1.93 +            sb.append('F');
    1.94 +            return;
    1.95 +        }
    1.96 +        if (type == Byte.TYPE) {
    1.97 +            sb.append('B');
    1.98 +            return;
    1.99 +        }
   1.100 +        if (type == Boolean.TYPE) {
   1.101 +            sb.append('Z');
   1.102 +            return;
   1.103 +        }
   1.104 +        if (type == Short.TYPE) {
   1.105 +            sb.append('S');
   1.106 +            return;
   1.107 +        }
   1.108 +        if (type == Void.TYPE) {
   1.109 +            sb.append('V');
   1.110 +            return;
   1.111 +        }
   1.112 +        if (type == Character.TYPE) {
   1.113 +            sb.append('C');
   1.114 +            return;
   1.115 +        }
   1.116 +        if (type.isArray()) {
   1.117 +            sb.append("_3");
   1.118 +            appendType(sb, type.getComponentType());
   1.119 +            return;
   1.120 +        }
   1.121 +        sb.append('L').append(type.getName().replace('.', '_'));
   1.122 +        sb.append("_2");
   1.123 +    }
   1.124  
   1.125      public static int signatureElements(String sig) {
   1.126          Enumeration<Class> en = signatureParser(sig);
   1.127 @@ -141,13 +202,19 @@
   1.128                          return Character.TYPE;
   1.129                      case 'L':
   1.130                          try {
   1.131 -                            int up = sig.indexOf("_2");
   1.132 -                            String type = sig.substring(1, up);
   1.133 +                            int up = sig.indexOf("_2", pos);
   1.134 +                            String type = sig.substring(pos, up);
   1.135                              pos = up + 2;
   1.136 -                            return Class.forName(type);
   1.137 +                            return Class.forName(type.replace('_', '.'));
   1.138                          } catch (ClassNotFoundException ex) {
   1.139 -                            // should not happen
   1.140 +                            throw new IllegalStateException(ex);
   1.141                          }
   1.142 +                    case '_': {
   1.143 +                        char nch = sig.charAt(pos++);
   1.144 +                        assert nch == '3' : "Can't find '3' at " + sig.substring(pos - 1);
   1.145 +                        final Class compType = nextElement();
   1.146 +                        return Array.newInstance(compType, 0).getClass();
   1.147 +                    }
   1.148                  }
   1.149                  throw new UnsupportedOperationException(sig + " at " + pos);
   1.150              }