Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Enable proxy to be used for abstract classes.
Before, it only worked with interfaces.
  • Loading branch information
jnthn committed Aug 7, 2013
1 parent 9d33bb1 commit f976687
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/BootJavaInterop.java
Expand Up @@ -942,7 +942,7 @@ protected Map<Method, SixModelObject> proxyGetMethods(ThreadContext tc, Class<?>
ret.put(m, methods.at_key_boxed(tc, l));
else if (methods.exists_key(tc, s) != 0)
ret.put(m, methods.at_key_boxed(tc, s));
else
else if (!Modifier.isAbstract(iface.getModifiers()) || Modifier.isAbstract(m.getModifiers()))
throw ExceptionHandling.dieInternal(tc, "method hash has no definition for "+l);
}
return ret;
Expand All @@ -956,11 +956,18 @@ protected Class<?> computeProxyClass(Class<?> iface) {
cc.className = className;
cc.cv = cw;

String superclass = "java/lang/Object";
String superclass;
List<String> ifaces = new ArrayList< >();

cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null,
"java/lang/Object", new String[] { Type.getInternalName(iface) });
if (Modifier.isInterface(iface.getModifiers())) {
cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null,
"java/lang/Object", new String[] { Type.getInternalName(iface) });
superclass = "java/lang/Object";
}
else {
superclass = Type.getInternalName(iface);
cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null,
superclass, new String[] { });
}
cw.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, "constants", "[Ljava/lang/Object;", null, null).visitEnd();
cw.visitField(Opcodes.ACC_PRIVATE, "methodMap", "Ljava/util/Map;", null, null).visitEnd();

Expand Down

0 comments on commit f976687

Please sign in to comment.