Javassist cannot compile super.m() if m is a default method declared in an interface.tags/rel_3_21_0-java9-ea
@@ -283,7 +283,7 @@ see javassist.Dump. | |||
<p>-version 3.21 | |||
<ul> | |||
<li>JIRA JASSIST-244 | |||
<li>JIRA JASSIST-244, 248 | |||
</ul> | |||
</p> | |||
@@ -642,7 +642,7 @@ public class MemberCodeGen extends CodeGen { | |||
bytecode.addInvokestatic(declClass, mname, desc); | |||
} | |||
else if (isSpecial) // if (isSpecial && notStatic(acc)) | |||
bytecode.addInvokespecial(declClass, mname, desc); | |||
bytecode.addInvokespecial(targetClass, mname, desc); | |||
else { | |||
if (!Modifier.isPublic(declClass.getModifiers()) | |||
|| declClass.isInterface() != targetClass.isInterface()) |
@@ -128,11 +128,11 @@ public class JvstTest5 extends JvstTestRoot { | |||
public void testJIRA248() throws Exception { | |||
CtClass cc = sloader.get("test5.JIRA248"); | |||
String methodBody = "public int run() { return foo() + super.foo(); }"; | |||
String methodBody = "public int run() { return foo() + super.foo() + super.bar(); }"; | |||
CtMethod ctMethod = CtMethod.make(methodBody, cc); | |||
cc.addMethod(ctMethod); | |||
cc.writeFile(); | |||
Object obj = make(cc.getName()); | |||
assertEquals(71, invoke(obj, "run")); | |||
assertEquals(271, invoke(obj, "run")); | |||
} | |||
} |
@@ -4,9 +4,14 @@ interface JIRA248Intf { | |||
default int foo() { return 1; } | |||
} | |||
class JIRA248Sup implements JIRA248Intf { | |||
class JIRA248Sup2 { | |||
public int bar() { return 200; } | |||
} | |||
class JIRA248Sup extends JIRA248Sup2 implements JIRA248Intf { | |||
} | |||
public class JIRA248 extends JIRA248Sup { | |||
public int foo() { return 70; } | |||
public int bar() { return 3000; } | |||
} |