Skip to content

Commit f976687

Browse files
committed
Enable proxy to be used for abstract classes.
Before, it only worked with interfaces.
1 parent 9d33bb1 commit f976687

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

src/vm/jvm/runtime/org/perl6/nqp/runtime/BootJavaInterop.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -942,7 +942,7 @@ protected Map<Method, SixModelObject> proxyGetMethods(ThreadContext tc, Class<?>
942942
ret.put(m, methods.at_key_boxed(tc, l));
943943
else if (methods.exists_key(tc, s) != 0)
944944
ret.put(m, methods.at_key_boxed(tc, s));
945-
else
945+
else if (!Modifier.isAbstract(iface.getModifiers()) || Modifier.isAbstract(m.getModifiers()))
946946
throw ExceptionHandling.dieInternal(tc, "method hash has no definition for "+l);
947947
}
948948
return ret;
@@ -956,11 +956,18 @@ protected Class<?> computeProxyClass(Class<?> iface) {
956956
cc.className = className;
957957
cc.cv = cw;
958958

959-
String superclass = "java/lang/Object";
959+
String superclass;
960960
List<String> ifaces = new ArrayList< >();
961-
962-
cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null,
963-
"java/lang/Object", new String[] { Type.getInternalName(iface) });
961+
if (Modifier.isInterface(iface.getModifiers())) {
962+
cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null,
963+
"java/lang/Object", new String[] { Type.getInternalName(iface) });
964+
superclass = "java/lang/Object";
965+
}
966+
else {
967+
superclass = Type.getInternalName(iface);
968+
cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null,
969+
superclass, new String[] { });
970+
}
964971
cw.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, "constants", "[Ljava/lang/Object;", null, null).visitEnd();
965972
cw.visitField(Opcodes.ACC_PRIVATE, "methodMap", "Ljava/util/Map;", null, null).visitEnd();
966973

0 commit comments

Comments
 (0)