# HG changeset patch # User Jaroslav Tulach # Date 1416776146 -3600 # Node ID 86e61729f754479c86154e55fed525d24a433d6f # Parent 1cf2e7cb9e916574dbe5facf94962d0cc4814471 Class.getInterfaces works diff -r 1cf2e7cb9e91 -r 86e61729f754 rt/emul/mini/src/main/java/java/lang/Class.java --- a/rt/emul/mini/src/main/java/java/lang/Class.java Sun Nov 23 20:50:19 2014 +0100 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java Sun Nov 23 21:55:46 2014 +0100 @@ -1547,6 +1547,7 @@ * * @return an array of interfaces implemented by this class. */ + @JavaScriptBody(args = { }, body = "return this.interfaces();") public native Class[] getInterfaces(); /** diff -r 1cf2e7cb9e91 -r 86e61729f754 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Nov 23 20:50:19 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Nov 23 21:55:46 2014 +0100 @@ -296,6 +296,21 @@ append(accessClass("java_lang_Class(true);")); append("\n CLS.$class.jvmName = '").append(cn).append("';"); append("\n CLS.$class.superclass = sprcls;"); + append("\n CLS.$class.interfaces = function() { return ["); + { + boolean first = true; + for (String intrfc : jc.getSuperInterfaces()) { + if (!first) { + append(","); + } + requireReference(intrfc); + String mangledIface = mangleClassName(intrfc); + append("\n "); + append(accessClass(mangledIface)).append("(false).constructor.$class"); + first = false; + } + } + append("\n ]; };"); append("\n CLS.$class.access = ").append(jc.getAccessFlags()+";"); append("\n CLS.$class.cnstr = CLS;"); byte[] classAnno = jc.findAnnotationData(false); diff -r 1cf2e7cb9e91 -r 86e61729f754 rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Sun Nov 23 20:50:19 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Sun Nov 23 21:55:46 2014 +0100 @@ -246,4 +246,12 @@ 1.0 ); } + + @Test public void nameOfSuperInterface() throws Exception { + String exp = Classes.superInterface(); + assertExec("Can get name of superinterface?", Classes.class, + "superInterface__Ljava_lang_String_2", + exp + ); + } } diff -r 1cf2e7cb9e91 -r 86e61729f754 rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Sun Nov 23 20:50:19 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Sun Nov 23 21:55:46 2014 +0100 @@ -260,6 +260,23 @@ return obj instanceof Serializable; } + public static String superInterface() { + return dumpInterfaces(SuperSerial.class); + } + + private static String dumpInterfaces(final Class aClass) { + final Class[] arr = aClass.getInterfaces(); + StringBuilder sb = new StringBuilder(); + for (Class c : arr) { + sb.append(c.getName()).append("\n"); + } + return sb.toString(); + } + + public static String superInterfaceInst() { + return dumpInterfaces(new SuperSerial() {}.getClass()); + } + private static interface SuperSerial extends Serializable { } }