Hi Andrew

   Thank you for recommending me the VM spec...

  But my prob is a little different,

        as you have said I can add local variables using 

        LocalVar var = localvargen.addLocalvar()
        int index = var.getIndex();
        llcalvargen.setstart( ilist.append ( new ASTORE ( index ) ) )
        .
        .
        . 
  
        as many as required     

        and at the calling setMaxLocals();

        That is OK.

        but now consider a scenario like this
        
        public int getI(){
                return 2;
        }

        Now I am trying to insert try-finally to this method by
instrumenting in bytecode 

        which should look like  

        public int getI(){
        try{
                return 2;
        }finally { 
                        System.out.println("sample");
        }
        
        }       

        To create this, I should create a empty catch block which throws
the exception that is not handled and redirect all the calls to finally
before the 
        return statement

        now comes the problem with local variables.


        I will get the instructionlist
        I will find the instance of return, and insert a JSR instr
before this return and redirect all the branches
        Next step is creation of catch block, where I have a problem
                        here I should store the exception, make a jsr
call, load the exception which I stored before and rethrow it

        so I use ilist.append ( new ASTORE ( ? ) )
                   ilist.append ( new JSR() );
                   ilist.load ( new ALOAD ( ? ) )
        
        so what should I use in the place of "?"  (2,3,4......)

        same while creating finally block, I should store the return
address
        
                   ilist.append ( new ASTORE ( ?? ) )
                   // performs the instrumentation of system.out.....
                   ret ?? 
        
        so what should I use in place of "?"  (2,3,4......)

        so what I am doing is 
        
        getting the max_index (maximum index) available in the
localvargen 
        and assigning max_index+1 to the first ?
        and assigning max_index+2 to the second ??

        am I wrong in doing like these?????

        is there some other efficient way for doing this???

        Please help me in this regard.

Thank you
Reddy
                
        




>-----Original Message-----
>From: Andrew Huntwork [mailto:[EMAIL PROTECTED] 
>Sent: Dienstag, 8. Februar 2005 16:01
>To: BCEL Users List
>Subject: Re: Query regarding index of local variables
>
>
>First, let me recommend a book to you that you may already know about:
>http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTO
>C.doc.html
>
>read carefully enough, this book will tell you everything you need to 
>know to screw around with class files to your heart's content.
>
>see below.
>
>Koduru, Rajendra Kumar Reddy wrote:
>[...]
>>      // code
>> 
>>              int i = methodgen.getLocalVariables().length
>>              my_lv1 = i+1;
>>              my_lv2 = i+2;
>>              my_lv =  i+3;
>> 
>>      // code
>> 
>>      and I used to store using il.append ( new ASTORE ( my_lv2 ) );
>> 
>> 
>>       I encountered a problem with this, i.e. the variable i returned
>> 22,
>>       where as the max index is 7.. So there was overlap in the local
>> vars and my class file got corrupted
>
>there is no relationship between number of local variables and 
>the first 
>free slot.  each LocalVariable describes the type contained in a slot 
>over a particular range of instructions.  there are 0 or more 
>LocalVariables for each slot.  You should print out the various fields 
>in your LocalVariables just to get a feel for what they contain, 
>especially the start index, end index and type.
>
>what you want is:
>
>setMaxLocals(); //if you have inserted variables already
>int i = methodgen.getMaxLocals();
>...
>
>In the project I used to work on (sandmark.cs.arizona.edu), 
>almost every 
>occurrence of getLocalVariables was a bug.  That's because the local 
>variable table may be incomplete, inaccurate (to some extent), 
>obfuscated, or just plain missing (MethodGen.removeLocalVariables() or 
>something like that).
>
>> 
>> 
>> 
>>       I just wanted to know..why is it like that.. Doesn't each local
>> variable have unique index?
>> 
>>       Isnt the length (i that is returned) mean the no of local
>> variables in the corresponding method?
>> 
>>      However now I tried using 
>> 
>>      // code
>> 
>>      int max_index = 0;
>> 
>>      LocalVariableGen[] lv1 = mgen.getLocalVariables();
>>      
>>     for(int i = 0; i< lv1.length; i++){
>> 
>>       if(lv1[i].getIndex() > max_index)
>>           max_index = lv1[i].getIndex();
>>       }      
>>              
>>              my_lv1 = i+1;
>>              my_lv2 = i+2;
>>              my_lv =  i+3;
>>      
>>      // code
>> 
>>      and it works fine..
>> 
>>      but I just wanted to clarify it.
>> 
>>      Please help me in this regard.
>> 
>> 
>> Thank you
>> Reddy
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>> 
>> 
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to