Goro Fuji created JASSIST-221:
---------------------------------
Summary: Got NPE when replacing a method in `instrument()`
Key: JASSIST-221
URL:
https://issues.jboss.org/browse/JASSIST-221
Project: Javassist
Issue Type: Bug
Affects Versions: 3.18.1-GA
Environment: JDK8 (build 1.8.0-b132) / Mac OSX 10.9.2
Reporter: Goro Fuji
Assignee: Shigeru Chiba
I'm trying to modify some code in static initializer with {{m.replace("$_ =
($r)false;")}}, but I got NPE:
{code}
Caused by: java.lang.NullPointerException
at javassist.bytecode.ConstPool.getMethodrefNameAndType(ConstPool.java:418)
at javassist.expr.MethodCall.getNameAndType(MethodCall.java:43)
at javassist.expr.MethodCall.getMethodName(MethodCall.java:107)
at com.github.gfx.javassistexamp.JavassistExample$2.edit(JavassistExample.groovy:29)
at javassist.expr.ExprEditor.loopBody(ExprEditor.java:192)
at javassist.expr.ExprEditor.doit(ExprEditor.java:91)
at javassist.CtBehavior.instrument(CtBehavior.java:712)
at javassist.CtBehavior$instrument.call(Unknown Source)
{code}
I guess it is because the static initializer has no method name, but ClassPool expects a
method (behavior) should have a name.
ref.
https://github.com/jboss-javassist/javassist/blob/master/src/main/javassi...
The NEP is caused by here:
https://github.com/gfx/Gradle-DebugAssertPlugin/blob/master/buildSrc/src/...
(Currently I use a patched version of javassist which is stored in the repo, so the
project works as expected.)
FYI, I have correct results with the following patch:
{code}
diff --git a/src/main/javassist/bytecode/ConstPool.java
b/src/main/javassist/bytecode/ConstPool.java
index f102421..9e62c89 100644
--- a/src/main/javassist/bytecode/ConstPool.java
+++ b/src/main/javassist/bytecode/ConstPool.java
@@ -265,6 +265,9 @@ public final class ConstPool {
*/
public int getNameAndTypeName(int index) {
NameAndTypeInfo ntinfo = (NameAndTypeInfo)getItem(index);
+ if (ntinfo == null) {
+ return 0;
+ }
return ntinfo.memberName;
}
@@ -415,6 +418,9 @@ public final class ConstPool {
*/
public int getMethodrefNameAndType(int index) {
MethodrefInfo minfo = (MethodrefInfo)getItem(index);
+ if (minfo == null) {
+ return 0;
+ }
return minfo.nameAndTypeIndex;
}
@@ -635,6 +641,9 @@ public final class ConstPool {
*/
public String getUtf8Info(int index) {
Utf8Info utf = (Utf8Info)getItem(index);
+ if (utf == null) {
+ return null;
+ }
return utf.string;
}
{code}
--
This message was sent by Atlassian JIRA
(v6.2.3#6260)