]> source.dussan.org Git - javassist.git/commitdiff
Fix JASSIST-220 11/head
authorJohan Kaving <johan.kaving@symsoft.com>
Wed, 2 Jul 2014 14:45:46 +0000 (16:45 +0200)
committerJohan Kaving <johan.kaving@symsoft.com>
Thu, 3 Jul 2014 13:49:59 +0000 (15:49 +0200)
Static methods on interfaces in Java 8 means
that the INVOKESTATIC opcode can sometimes refer
to an item that is an InterfaceMethodrefInfo
(instead of a MethodrefInfo).

This is now handled in the
ConstPool.getMethodref...() methods by casting
to MemberrefInfo instead (since MemberrefInfo
contains all the needed information).

src/main/javassist/bytecode/ConstPool.java
src/test/javassist/JvstTest4.java
src/test/test4/JIRA220.java [new file with mode: 0644]

index f1024216d7fadf58c6821c39111e1374bfc7a1fd..f05dfd4f760fbf978f37c56758de15dfe3cfb5ff 100644 (file)
@@ -389,7 +389,7 @@ public final class ConstPool {
      * at the given index.
      */
     public int getMethodrefClass(int index) {
-        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         return minfo.classIndex;
     }
 
@@ -401,7 +401,7 @@ public final class ConstPool {
      * @return the name of the class at that <code>class_index</code>.
      */
     public String getMethodrefClassName(int index) {
-        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         if (minfo == null)
             return null;
         else
@@ -414,7 +414,7 @@ public final class ConstPool {
      * at the given index.
      */
     public int getMethodrefNameAndType(int index) {
-        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         return minfo.nameAndTypeIndex;
     }
 
@@ -427,7 +427,7 @@ public final class ConstPool {
      * @return  the name of the method.
      */
     public String getMethodrefName(int index) {
-        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         if (minfo == null)
             return null;
         else {
@@ -449,7 +449,7 @@ public final class ConstPool {
      * @return  the descriptor of the method.
      */
     public String getMethodrefType(int index) {
-        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         if (minfo == null)
             return null;
         else {
@@ -468,8 +468,7 @@ public final class ConstPool {
      * at the given index.
      */
     public int getInterfaceMethodrefClass(int index) {
-        InterfaceMethodrefInfo minfo
-            = (InterfaceMethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         return minfo.classIndex;
     }
 
@@ -481,8 +480,7 @@ public final class ConstPool {
      * @return the name of the class at that <code>class_index</code>.
      */
     public String getInterfaceMethodrefClassName(int index) {
-        InterfaceMethodrefInfo minfo
-            = (InterfaceMethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         return getClassInfo(minfo.classIndex);
     }
 
@@ -492,8 +490,7 @@ public final class ConstPool {
      * at the given index.
      */
     public int getInterfaceMethodrefNameAndType(int index) {
-        InterfaceMethodrefInfo minfo
-            = (InterfaceMethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         return minfo.nameAndTypeIndex;
     }
 
@@ -507,8 +504,7 @@ public final class ConstPool {
      * @return  the name of the method.
      */
     public String getInterfaceMethodrefName(int index) {
-        InterfaceMethodrefInfo minfo
-            = (InterfaceMethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         if (minfo == null)
             return null;
         else {
@@ -531,8 +527,7 @@ public final class ConstPool {
      * @return  the descriptor of the method.
      */
     public String getInterfaceMethodrefType(int index) {
-        InterfaceMethodrefInfo minfo
-            = (InterfaceMethodrefInfo)getItem(index);
+        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
         if (minfo == null)
             return null;
         else {
index f8994cd73f68c9140f8c6e8fc1d12287b8577859..6ea33308c9008cae33ef22183b94f42cf122c7dc 100644 (file)
@@ -980,4 +980,20 @@ public class JvstTest4 extends JvstTestRoot {
         assertEquals("i", cp.getUtf8Info(attr.name(0)));
         assertEquals("s", cp.getUtf8Info(attr.name(1)));
     }
+
+    // JIRA JASSIST-220
+    public void testStaticInterfaceMethods() throws Exception {
+        CtClass cc = sloader.get("test4.JIRA220");
+
+        cc.getMethod("foo", "()V").instrument(new ExprEditor() {
+            @Override
+            public void edit(MethodCall m) throws CannotCompileException {
+                try {
+                    m.getClassName();
+                } catch (Exception e) {
+                    fail(e.getMessage());
+                }
+            }
+        });
+    }
 }
diff --git a/src/test/test4/JIRA220.java b/src/test/test4/JIRA220.java
new file mode 100644 (file)
index 0000000..2757427
--- /dev/null
@@ -0,0 +1,17 @@
+package test4;
+
+
+import java.util.function.IntConsumer;
+import java.util.stream.IntStream;
+
+interface JIRA220intf {
+    static void bar() {
+        // Do something
+    }
+}
+
+public class JIRA220 implements JIRA220intf {
+    public static void foo() {
+        JIRA220intf.bar();
+    }
+}