From a4f46cd3a9445b7c90b8d8b029f069b4db1a342e Mon Sep 17 00:00:00 2001 From: chibash Date: Thu, 28 May 2015 09:41:41 +0900 Subject: fixed JASSIST-242 --- Readme.html | 2 +- src/main/javassist/compiler/MemberCodeGen.java | 13 ++++++------- src/test/javassist/JvstTest5.java | 24 ++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Readme.html b/Readme.html index b280a740..446edebd 100644 --- a/Readme.html +++ b/Readme.html @@ -283,7 +283,7 @@ see javassist.Dump.

-version 3.20

diff --git a/src/main/javassist/compiler/MemberCodeGen.java b/src/main/javassist/compiler/MemberCodeGen.java index f799eea0..67031992 100644 --- a/src/main/javassist/compiler/MemberCodeGen.java +++ b/src/main/javassist/compiler/MemberCodeGen.java @@ -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"); diff --git a/src/test/javassist/JvstTest5.java b/src/test/javassist/JvstTest5.java index 097dcd4d..fcbbbb99 100644 --- a/src/test/javassist/JvstTest5.java +++ b/src/test/javassist/JvstTest5.java @@ -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")); + } } -- cgit v1.2.3