[jboss-jira] [JBoss JIRA] (JASSIST-221) Got NPE when replacing a method in `instrument()`

Goro Fuji (JIRA) issues at jboss.org
Sun May 4 23:09:58 EDT 2014


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/javassist/bytecode/ConstPool.java#L418

The NEP is caused by here: https://github.com/gfx/Gradle-DebugAssertPlugin/blob/master/buildSrc/src/main/groovy/com/github/gfx/debugassert/DebugAssertPlugin.groovy#L82-82
(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)


More information about the jboss-jira mailing list