[jboss-jira] [JBoss JIRA] (JASSIST-158) Method calls with a parameter of long[] or double[] are compiled to incorrect bytecode resulting in errors such as java.lang.VerifyError: ... Inconsistent args_size for opc_invokeinterface

Jens Deppe (JIRA) jira-events at lists.jboss.org
Wed Mar 7 12:13:36 EST 2012


Jens Deppe created JASSIST-158:
----------------------------------

             Summary: Method calls with a parameter of long[] or double[] are compiled to incorrect bytecode resulting in errors such as java.lang.VerifyError: ... Inconsistent args_size for opc_invokeinterface
                 Key: JASSIST-158
                 URL: https://issues.jboss.org/browse/JASSIST-158
             Project: Javassist
          Issue Type: Bug
            Reporter: Jens Deppe
            Assignee: Shigeru Chiba


I believe this patch fixes the problem:

Method calls with a parameter of long[] or double[] are compiled to incorrect bytecode. For example, the following piece of code...

long[] aLongArray;
PdxWriter writer;
...
writer.writeLongArray("aLongArray", aLongArray);

Produces code similar to this:

   13:  aload_1
   14:  ldc     #32; //String aLongArray
   16:  aload_0
   17:  getfield        #35; //Field aLongArray:[J
   20:  invokeinterface #39,  4; //InterfaceMethod com/gemstone/gemfire/pdx/PdxWriter.writeLongArray:(Ljava/lang/String;[J)Lcom/gemstone/gemfire/pdx/PdxWriter;
   25:  pop

Following the code, it looks like getfield calculates an incorrect stackdepth when applied to a long[] or double[], resulting in an incorrect number of args applied to invokeinterface.

The following patch seems to fix things. 

Index: src/main/javassist/compiler/MemberCodeGen.java
===================================================================
--- src/main/javassist/compiler/MemberCodeGen.java	(revision 624)
+++ src/main/javassist/compiler/MemberCodeGen.java	(working copy)
@@ -957,7 +957,7 @@
         else
             className = null;
 
-        boolean is2byte = (c == 'J' || c == 'D');
+        boolean is2byte = ((c == 'J' || c == 'D') && dim == 0);
         return is2byte;
     }


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the jboss-jira mailing list