rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java
branchjavac
changeset 1321 7a78a84ab583
parent 772 d382dacfd73f
child 1586 d4ee65642d8d
     1.1 --- a/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java	Tue Feb 26 16:54:16 2013 +0100
     1.2 +++ b/rt/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/MethodImpl.java	Sat Sep 28 12:03:59 2013 +0200
     1.3 @@ -18,6 +18,7 @@
     1.4  package org.apidesign.bck2brwsr.emul.reflect;
     1.5  
     1.6  import java.lang.reflect.Array;
     1.7 +import java.lang.reflect.Constructor;
     1.8  import java.lang.reflect.Method;
     1.9  import java.util.Enumeration;
    1.10  import org.apidesign.bck2brwsr.core.JavaScriptBody;
    1.11 @@ -37,15 +38,17 @@
    1.12      }
    1.13  
    1.14      protected abstract Method create(Class<?> declaringClass, String name, Object data, String sig);
    1.15 +    protected abstract Constructor create(Class<?> declaringClass, Object data, String sig);
    1.16      
    1.17      
    1.18      //
    1.19      // bck2brwsr implementation
    1.20      //
    1.21  
    1.22 -    @JavaScriptBody(args = {"clazz", "prefix"},
    1.23 +    @JavaScriptBody(args = {"clazz", "prefix", "cnstr"},
    1.24          body = ""
    1.25 -        + "var c = clazz.cnstr.prototype;"
    1.26 +        + "var c = clazz.cnstr;\n"
    1.27 +        + "if (!cnstr) c = c.prototype;"
    1.28          + "var arr = new Array();\n"
    1.29          + "for (m in c) {\n"
    1.30          + "  if (m.indexOf(prefix) === 0) {\n"
    1.31 @@ -57,11 +60,55 @@
    1.32          + "}\n"
    1.33          + "return arr;")
    1.34      private static native Object[] findMethodData(
    1.35 -        Class<?> clazz, String prefix);
    1.36 +        Class<?> clazz, String prefix, boolean cnstr);
    1.37  
    1.38 +    public static Constructor findConstructor(
    1.39 +        Class<?> clazz, Class<?>... parameterTypes) {
    1.40 +        Object[] data = findMethodData(clazz, "cons__", true);
    1.41 +        BIG: for (int i = 0; i < data.length; i += 3) {
    1.42 +            String sig = ((String) data[i]).substring(6);
    1.43 +            Class<?> cls = (Class<?>) data[i + 2];
    1.44 +            Constructor tmp = INSTANCE.create(cls, data[i + 1], sig);
    1.45 +            Class<?>[] tmpParms = tmp.getParameterTypes();
    1.46 +            if (parameterTypes.length != tmpParms.length) {
    1.47 +                continue;
    1.48 +            }
    1.49 +            for (int j = 0; j < tmpParms.length; j++) {
    1.50 +                if (!parameterTypes[j].equals(tmpParms[j])) {
    1.51 +                    continue BIG;
    1.52 +                }
    1.53 +            }
    1.54 +            return tmp;
    1.55 +        }
    1.56 +        return null;
    1.57 +    }
    1.58 +
    1.59 +    public static Constructor[] findConstructors(Class<?> clazz, int mask) {
    1.60 +        Object[] namesAndData = findMethodData(clazz, "", true);
    1.61 +        int cnt = 0;
    1.62 +        for (int i = 0; i < namesAndData.length; i += 3) {
    1.63 +            String sig = (String) namesAndData[i];
    1.64 +            Object data = namesAndData[i + 1];
    1.65 +            if (!sig.startsWith("cons__")) {
    1.66 +                continue;
    1.67 +            }
    1.68 +            sig = sig.substring(6);
    1.69 +            Class<?> cls = (Class<?>) namesAndData[i + 2];
    1.70 +            final Constructor m = INSTANCE.create(cls, data, sig);
    1.71 +            if ((m.getModifiers() & mask) == 0) {
    1.72 +                continue;
    1.73 +            }
    1.74 +            namesAndData[cnt++] = m;
    1.75 +        }
    1.76 +        Constructor[] arr = new Constructor[cnt];
    1.77 +        for (int i = 0; i < cnt; i++) {
    1.78 +            arr[i] = (Constructor) namesAndData[i];
    1.79 +        }
    1.80 +        return arr;
    1.81 +    }
    1.82      public static Method findMethod(
    1.83          Class<?> clazz, String name, Class<?>... parameterTypes) {
    1.84 -        Object[] data = findMethodData(clazz, name + "__");
    1.85 +        Object[] data = findMethodData(clazz, name + "__", false);
    1.86          BIG: for (int i = 0; i < data.length; i += 3) {
    1.87              String sig = ((String) data[i]).substring(name.length() + 2);
    1.88              Class<?> cls = (Class<?>) data[i + 2];
    1.89 @@ -81,7 +128,7 @@
    1.90      }
    1.91  
    1.92      public static Method[] findMethods(Class<?> clazz, int mask) {
    1.93 -        Object[] namesAndData = findMethodData(clazz, "");
    1.94 +        Object[] namesAndData = findMethodData(clazz, "", false);
    1.95          int cnt = 0;
    1.96          for (int i = 0; i < namesAndData.length; i += 3) {
    1.97              String sig = (String) namesAndData[i];