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 }