emul/src/main/java/java/lang/reflect/Method.java
changeset 391 8cddb5d3e18f
parent 355 eea0065bcc1a
child 392 44a5802816be
     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  }