aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchibash <chiba@javassist.org>2015-05-28 09:41:41 +0900
committerchibash <chiba@javassist.org>2015-05-28 09:41:41 +0900
commita4f46cd3a9445b7c90b8d8b029f069b4db1a342e (patch)
tree40d6b4dc5b61ac7e5c9fc1a60030622a92cc2054
parent6dc421894d4ab8f981c45cd88de853fb86fed8bf (diff)
downloadjavassist-a4f46cd3a9445b7c90b8d8b029f069b4db1a342e.tar.gz
javassist-a4f46cd3a9445b7c90b8d8b029f069b4db1a342e.zip
fixed JASSIST-242
-rw-r--r--Readme.html2
-rw-r--r--src/main/javassist/compiler/MemberCodeGen.java13
-rw-r--r--src/test/javassist/JvstTest5.java24
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.
<p>-version 3.20
<ul>
-<li>JIRA JASSIST-241, 246.
+<li>JIRA JASSIST-241, 242, 246.
</ul>
</p>
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"));
+ }
}