# HG changeset patch # User Jaroslav Tulach # Date 1356694532 -3600 # Node ID 44a5802816be3b972883d67184aefd00a39a0de4 # Parent 8cddb5d3e18f835fffec30fe138cc40885a77f41 Class.getMethods returns only public methods diff -r 8cddb5d3e18f -r 44a5802816be emul/src/main/java/java/lang/Class.java --- a/emul/src/main/java/java/lang/Class.java Fri Dec 28 08:48:08 2012 +0100 +++ b/emul/src/main/java/java/lang/Class.java Fri Dec 28 12:35:32 2012 +0100 @@ -641,7 +641,7 @@ * @since JDK1.1 */ public Method[] getMethods() throws SecurityException { - return MethodImpl.findMethods(this); + return MethodImpl.findMethods(this, 0x01); } /** diff -r 8cddb5d3e18f -r 44a5802816be emul/src/main/java/java/lang/reflect/Method.java --- a/emul/src/main/java/java/lang/reflect/Method.java Fri Dec 28 08:48:08 2012 +0100 +++ b/emul/src/main/java/java/lang/reflect/Method.java Fri Dec 28 12:35:32 2012 +0100 @@ -57,7 +57,6 @@ private final String name; private final Object data; private final String sig; - private int modifiers; // Generics infrastructure @@ -109,9 +108,12 @@ * @see Modifier */ public int getModifiers() { - return modifiers; + return getAccess(data); } - + + @JavaScriptBody(args = "self", body = "return self.access;") + private static native int getAccess(Object self); + /** * Returns an array of {@code TypeVariable} objects that represent the * type variables declared by the generic declaration represented by this diff -r 8cddb5d3e18f -r 44a5802816be emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java --- a/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java Fri Dec 28 08:48:08 2012 +0100 +++ b/emul/src/main/java/org/apidesign/bck2brwsr/emul/MethodImpl.java Fri Dec 28 12:35:32 2012 +0100 @@ -62,7 +62,6 @@ private static native Object[] findMethodData( Class clazz, String prefix); - // XXX should not be public public static Method findMethod( Class clazz, String name, Class... parameterTypes) { Object[] data = findMethodData(clazz, name + "__"); @@ -73,7 +72,7 @@ return INSTANCE.create(clazz, name, data[1], sig); } - public static Method[] findMethods(Class clazz) { + public static Method[] findMethods(Class clazz, int mask) { Object[] namesAndData = findMethodData(clazz, ""); int cnt = 0; for (int i = 0; i < namesAndData.length; i += 2) { @@ -85,7 +84,11 @@ } String name = sig.substring(0, middle); sig = sig.substring(middle + 2); - namesAndData[cnt++] = INSTANCE.create(clazz, name, data, sig); + final Method m = INSTANCE.create(clazz, name, data, sig); + if ((m.getModifiers() & mask) == 0) { + continue; + } + namesAndData[cnt++] = m; } Method[] arr = new Method[cnt]; for (int i = 0; i < cnt; i++) { diff -r 8cddb5d3e18f -r 44a5802816be javap/src/main/java/org/apidesign/javap/MethodData.java --- a/javap/src/main/java/org/apidesign/javap/MethodData.java Fri Dec 28 08:48:08 2012 +0100 +++ b/javap/src/main/java/org/apidesign/javap/MethodData.java Fri Dec 28 12:35:32 2012 +0100 @@ -235,22 +235,8 @@ /** * Return access of the method. */ - public String[] getAccess(){ - - Vector v = new Vector(); - if ((access & ACC_PUBLIC) !=0) v.addElement("public"); - if ((access & ACC_PRIVATE) !=0) v.addElement("private"); - if ((access & ACC_PROTECTED) !=0) v.addElement("protected"); - if ((access & ACC_STATIC) !=0) v.addElement("static"); - if ((access & ACC_FINAL) !=0) v.addElement("final"); - if ((access & ACC_SYNCHRONIZED) !=0) v.addElement("synchronized"); - if ((access & ACC_NATIVE) !=0) v.addElement("native"); - if ((access & ACC_ABSTRACT) !=0) v.addElement("abstract"); - if ((access & ACC_STRICT) !=0) v.addElement("strictfp"); - - String[] accflags = new String[v.size()]; - v.copyInto(accflags); - return accflags; + public int getAccess(){ + return access; } /** diff -r 8cddb5d3e18f -r 44a5802816be vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Dec 28 08:48:08 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Dec 28 12:35:32 2012 +0100 @@ -147,6 +147,7 @@ generateAnno(jc, out, runAnno); out.append("\n };"); } + out.append("\n c.").append(mn).append(".access = " + m.getAccess()).append(";"); } out.append("\n c.constructor = CLS;"); out.append("\n c.$instOf_").append(className).append(" = true;"); diff -r 8cddb5d3e18f -r 44a5802816be vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Fri Dec 28 08:48:08 2012 +0100 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Fri Dec 28 12:35:32 2012 +0100 @@ -17,6 +17,11 @@ */ package org.apidesign.bck2brwsr.tck; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.apidesign.bck2brwsr.core.JavaScriptBody; import org.apidesign.bck2brwsr.vmtest.Compare; import org.apidesign.bck2brwsr.vmtest.VMTest; import org.testng.annotations.Factory; @@ -34,6 +39,25 @@ return long.class.toString(); } + @Compare public String namesOfMethods() { + StringBuilder sb = new StringBuilder(); + String[] arr = new String[20]; + int i = 0; + for (Method m : StaticUse.class.getMethods()) { + arr[i++] = m.getName(); + } + for (String s : sort(arr, i)) { + sb.append(s).append("\n"); + } + return sb.toString(); + } + + @JavaScriptBody(args = { "arr", "len" }, body="var a = arr.slice(0, len); a.sort(); return a;") + private static String[] sort(String[] arr, int len) { + List list = Arrays.asList(arr).subList(0, len); + Collections.sort(list); + return list.toArray(new String[0]); + } @Factory public static Object[] create() {