@@ -283,7 +283,7 @@ see javassist.Dump. | |||
<p>-version 3.20 | |||
<ul> | |||
<li>JIRA JASSIST-241, 246. | |||
<li>JIRA JASSIST-241, 242, 246. | |||
</ul> | |||
</p> | |||
@@ -568,9 +568,6 @@ public class MemberCodeGen extends CodeGen { | |||
// generate code for evaluating arguments. | |||
atMethodArgs(args, types, dims, cnames); | |||
// used by invokeinterface | |||
int count = bytecode.getStackDepth() - stack + 1; | |||
if (found == null) | |||
found = resolver.lookupMethod(targetClass, thisClass, thisMethod, | |||
mname, types, dims, cnames); | |||
@@ -587,12 +584,12 @@ public class MemberCodeGen extends CodeGen { | |||
} | |||
atMethodCallCore2(targetClass, mname, isStatic, isSpecial, | |||
aload0pos, count, found); | |||
aload0pos, found); | |||
} | |||
private void atMethodCallCore2(CtClass targetClass, String mname, | |||
boolean isStatic, boolean isSpecial, | |||
int aload0pos, int count, | |||
int aload0pos, | |||
MemberResolver.Method found) | |||
throws CompileError | |||
{ | |||
@@ -651,8 +648,10 @@ public class MemberCodeGen extends CodeGen { | |||
|| declClass.isInterface() != targetClass.isInterface()) | |||
declClass = targetClass; | |||
if (declClass.isInterface()) | |||
bytecode.addInvokeinterface(declClass, mname, desc, count); | |||
if (declClass.isInterface()) { | |||
int nargs = Descriptor.paramSize(desc) + 1; | |||
bytecode.addInvokeinterface(declClass, mname, desc, nargs); | |||
} | |||
else | |||
if (isStatic) | |||
throw new CompileError(mname + " is not static"); |
@@ -67,4 +67,28 @@ public class JvstTest5 extends JvstTestRoot { | |||
String src = "public void id() { get(); }"; | |||
CtMethod make = CtNewMethod.make(src, ctClass); | |||
} | |||
public void testJIRA242() throws Exception { | |||
Boolean ss = new Boolean(2 > 3); | |||
ClassPool cp = ClassPool.getDefault(); | |||
CtClass cc = cp.get("test5.JIRA242$Hello"); | |||
CtMethod m = cc.getDeclaredMethod("say"); | |||
m.insertBefore("{ System.out.println(\"Say Hello...\"); }"); | |||
StringBuilder sb = new StringBuilder(); | |||
sb.append("BOOL_SERIES = createBooleanSeriesStep();"); | |||
//Below code cause the issue | |||
sb.append("BOOL_SERIES.setValue(3>=3);"); //lets comment this and run it will work | |||
// Below code snippets will work | |||
// this cast into exact class and call the same function | |||
sb.append("((test5.JIRA242$BooleanDataSeries)BOOL_SERIES).setValue(3>=3);"); | |||
// this code snippet will set exact boolean variable to the function. | |||
sb.append("boolean var = 3>=3;"); | |||
sb.append("BOOL_SERIES.setValue(var);"); | |||
m.insertBefore(sb.toString()); | |||
cc.writeFile(); | |||
Object obj = make(cc.getName()); | |||
assertEquals(0, invoke(obj, "say")); | |||
} | |||
} |