commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Emmanuel Bourg (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (BCEL-123) MethodGen: LocalVariableTableGen issues
Date Mon, 23 Feb 2015 20:24:13 GMT

    [ https://issues.apache.org/jira/browse/BCEL-123?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13511912#comment-13511912
] 

Emmanuel Bourg edited comment on BCEL-123 at 2/23/15 8:23 PM:
--------------------------------------------------------------

MethodGen mistakenly fills in LocalVariableTableGen from both LocalVariableTable and LocalVariableTypeTable.
 In parsing LocalVariableTypeTable, it incorrectly reads the signatures with generics.  As
a result, the LocalVariableTable is corrupted.

Here is an example:

{code}
public class VariableTableBug
{

   public String getFirstItem( final List< String > list )
   {
      int index = 0;
      String result = list.get( index );
      return result;
   }

   public static void main( final String[] args ) throws Exception
   {
      // find the resource that is our class
      Class< VariableTableBug > clazz = VariableTableBug.class;
      String resource = clazz.getName().replace( '.', '/' ) + ".class";
      
      // load it using BCEL
      JavaClass javaClass = new ClassParser( clazz.getClassLoader().getResourceAsStream( resource
),
                                             resource ).parse();
      
      // convert everything to a ClassGen
      ClassGen classGen = new ClassGen( javaClass );
      
      // find them getFirstItem method
      Method getFirstItemMethod = null;
      for ( Method method : classGen.getMethods() )
      {
         if ( method.getName().equals( "getFirstItem" ) )
         {
            getFirstItemMethod = method;
            break;
         }
      }
      
      // dump the LocalVariableTable attribute
      System.out.println( "LocalVariableTable of original" );
      System.out.println( "------------------------------" );
      for ( LocalVariable localVariable : getFirstItemMethod.getLocalVariableTable().getLocalVariableTable()
)
      {
         System.out.println( localVariable.getName() + "\t" + localVariable.getIndex() + "\t"
+ localVariable.getSignature() );
      }
      System.out.println();

      // dump the LocalVariableTypeTable attribute
      for ( Attribute attribute : getFirstItemMethod.getCode().getAttributes() )
      {
         if ( attribute instanceof LocalVariableTypeTable )
         {
            System.out.println( "LocalVariableTypeTable of original" );
            System.out.println( "----------------------------------" );
            for ( LocalVariable localVariable : ( (LocalVariableTypeTable) attribute ).getLocalVariableTypeTable()
)
            {
               System.out.println( localVariable.getName() + "\t" + localVariable.getIndex()
+ "\t" + localVariable.getSignature() );
            }
         }
      }
      System.out.println();
      
      // now convert to a MethodGen
      MethodGen methodGen = new MethodGen( getFirstItemMethod,
                                           classGen.getClassName(),
                                           classGen.getConstantPool() );
      
      // dump the LocalVariableTable
      System.out.println( "LocalVariableTable of MethodGen" );
      System.out.println( "-------------------------------" );
      for ( LocalVariableGen localVariableGen : methodGen.getLocalVariables() )
      {
         System.out.println( localVariableGen.getName() + "\t" + localVariableGen.getIndex()
+ "\t" + localVariableGen.getType() );
      }
   }
   
}
{code}


was (Author: mj.wilson.uk@googlemail.com):
MethodGen mistakenly fills in LocalVariableTableGen from both LocalVariableTable and LocalVariableTypeTable.
 In parsing LocalVariableTypeTable, it incorrectly reads the signatures with generics.  As
a result, the LocalVariableTable is corrupted.

Here is an example:

public class VariableTableBug
{

   public String getFirstItem( final List< String > list )
   {
      int index = 0;
      String result = list.get( index );
      return result;
   }

   public static void main( final String[] args ) throws Exception
   {
      // find the resource that is our class
      Class< VariableTableBug > clazz = VariableTableBug.class;
      String resource = clazz.getName().replace( '.', '/' ) + ".class";
      
      // load it using BCEL
      JavaClass javaClass = new ClassParser( clazz.getClassLoader().getResourceAsStream( resource
),
                                             resource ).parse();
      
      // convert everything to a ClassGen
      ClassGen classGen = new ClassGen( javaClass );
      
      // find them getFirstItem method
      Method getFirstItemMethod = null;
      for ( Method method : classGen.getMethods() )
      {
         if ( method.getName().equals( "getFirstItem" ) )
         {
            getFirstItemMethod = method;
            break;
         }
      }
      
      // dump the LocalVariableTable attribute
      System.out.println( "LocalVariableTable of original" );
      System.out.println( "------------------------------" );
      for ( LocalVariable localVariable : getFirstItemMethod.getLocalVariableTable().getLocalVariableTable()
)
      {
         System.out.println( localVariable.getName() + "\t" + localVariable.getIndex() + "\t"
+ localVariable.getSignature() );
      }
      System.out.println();

      // dump the LocalVariableTypeTable attribute
      for ( Attribute attribute : getFirstItemMethod.getCode().getAttributes() )
      {
         if ( attribute instanceof LocalVariableTypeTable )
         {
            System.out.println( "LocalVariableTypeTable of original" );
            System.out.println( "----------------------------------" );
            for ( LocalVariable localVariable : ( (LocalVariableTypeTable) attribute ).getLocalVariableTypeTable()
)
            {
               System.out.println( localVariable.getName() + "\t" + localVariable.getIndex()
+ "\t" + localVariable.getSignature() );
            }
         }
      }
      System.out.println();
      
      // now convert to a MethodGen
      MethodGen methodGen = new MethodGen( getFirstItemMethod,
                                           classGen.getClassName(),
                                           classGen.getConstantPool() );
      
      // dump the LocalVariableTable
      System.out.println( "LocalVariableTable of MethodGen" );
      System.out.println( "-------------------------------" );
      for ( LocalVariableGen localVariableGen : methodGen.getLocalVariables() )
      {
         System.out.println( localVariableGen.getName() + "\t" + localVariableGen.getIndex()
+ "\t" + localVariableGen.getType() );
      }
   }
   
}

> MethodGen: LocalVariableTableGen issues
> ---------------------------------------
>
>                 Key: BCEL-123
>                 URL: https://issues.apache.org/jira/browse/BCEL-123
>             Project: Commons BCEL
>          Issue Type: Bug
>          Components: Main
>    Affects Versions: unspecified
>         Environment: Operating System: Linux
> Platform: PC
>            Reporter: Matthew Wilson
>            Assignee: Apache Commons Developers
>




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message