1.1 --- a/emul/src/main/java/java/lang/reflect/Method.java Thu Dec 20 08:59:47 2012 +0100
1.2 +++ b/emul/src/main/java/java/lang/reflect/Method.java Fri Dec 28 08:48:08 2012 +0100
1.3 @@ -28,6 +28,7 @@
1.4 import java.lang.annotation.Annotation;
1.5 import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.6 import org.apidesign.bck2brwsr.emul.AnnotationImpl;
1.7 +import org.apidesign.bck2brwsr.emul.MethodImpl;
1.8
1.9 /**
1.10 * A {@code Method} provides information about, and access to, a single method
1.11 @@ -653,57 +654,12 @@
1.12 public Annotation[][] getParameterAnnotations() {
1.13 throw new UnsupportedOperationException();
1.14 }
1.15 -
1.16 - //
1.17 - // bck2brwsr implementation
1.18 - //
1.19
1.20 - @JavaScriptBody(args = { "clazz", "prefix" },
1.21 - body = ""
1.22 - + "var c = clazz.cnstr.prototype;"
1.23 - + "var arr = new Array();\n"
1.24 - + "for (m in c) {\n"
1.25 - + " if (m.indexOf(prefix) === 0) {\n"
1.26 - + " arr.push(m);\n"
1.27 - + " arr.push(c[m]);\n"
1.28 - + " }"
1.29 - + "}\n"
1.30 - + "return arr;"
1.31 - )
1.32 - private static native Object[] findMethodData(
1.33 - Class<?> clazz, String prefix
1.34 - );
1.35 -
1.36 - // XXX should not be public
1.37 - public static Method findMethod(
1.38 - Class<?> clazz, String name, Class<?>... parameterTypes
1.39 - ) {
1.40 - Object[] data = findMethodData(clazz, name + "__");
1.41 - if (data.length == 0) {
1.42 - return null;
1.43 - }
1.44 - String sig = ((String)data[0]).substring(name.length() + 2);
1.45 - return new Method(clazz, name, data[1], sig);
1.46 - }
1.47 -
1.48 - public static Method[] findMethods(Class<?> clazz) {
1.49 - Object[] namesAndData = findMethodData(clazz, "");
1.50 - int cnt = 0;
1.51 - for (int i = 0; i < namesAndData.length; i += 2) {
1.52 - String sig = (String) namesAndData[i];
1.53 - Object data = namesAndData[i + 1];
1.54 - int middle = sig.indexOf("__");
1.55 - if (middle == -1) {
1.56 - continue;
1.57 + static {
1.58 + MethodImpl.INSTANCE = new MethodImpl() {
1.59 + protected Method create(Class<?> declaringClass, String name, Object data, String sig) {
1.60 + return new Method(declaringClass, name, data, sig);
1.61 }
1.62 - String name = sig.substring(0, middle);
1.63 - sig = sig.substring(middle + 2);
1.64 - namesAndData[cnt++] = new Method(clazz, name, data, sig);
1.65 - }
1.66 - Method[] arr = new Method[cnt];
1.67 - for (int i = 0; i < cnt; i++) {
1.68 - arr[i] = (Method)namesAndData[i];
1.69 - }
1.70 - return arr;
1.71 + };
1.72 }
1.73 }