Hi Andrew, 

  I have gone thru this concept of assigning a slot to local variables
by observing the local variable tables of  the class files, yep each
slot is being taken by many local var. so I used getMaxLocals() and it
worked fine (removed my own way of fidning max index, which sometimes is
causing an error due to incomplete lv table).

Please find a comment inline regarding the comment made by you "stack
height mismatch verification error".



        
 

>Koduru, Rajendra Kumar Reddy wrote:
>> Hi Andrew
>> 
>>    Thank you for recommending me the VM spec...
>
>Reading the VM spec is not as stupid an idea as it might 
>sound.  I'm not 
>aware of any more concise or helpful reference for bytecode 
>manipulators.  Can anyone suggest a better one?
>
>> 
>>   But my prob is a little different,
>
>It seems that your problem can be summarized as, "How do i 
>choose a free 
>slot?"  That's the question i answered in my previous email.  
>see below 
>for further explanation.
>
>> 
>>      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.
>
>none of this is actually required.  the local variable table 
>is just for 
>debugging purposes, and as i said before, may be inaccurate, 
>incomplete, 
>obfuscated, or missing.  feel free to ignore LocalVar objects 
>completely 
>and just choose some slots yourself and use them.
>
>The usual way of choosing slots, as far as I'm aware, is to call 
>getMaxLocals:
>
>MethodGen mg = ...
>int freeSlot = mg.getMaxLocals();
>int freeSlot2 = freeSlot + 1;
>mg.getInstructionList().append(new ASTORE(freeSlot));
>...
>
>> 
>>      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
>
>btw, when you get past your other problems, it seems like you 
>might have 
>a stack height mismatch verification error at your subroutine.  ask 
>about that if it happens.  if i'm right, it'll happen in any non-void 
>method you instrument.



        Andrew, I did not get that type of error, however could you
please let me know , why were you expecting this??
        in non void methods, I was using 

        1.      new ASTORE(x)   // storing the result
        2.      jsr call                // calling jsr
        3.      new ALOAD(x)    // loading back the result
        4.      return          // returning the result

        and all the branches were reidrected to 1 (i.e store statement)
in case of non void methods

        so could you please let me know , why were you expecting an
error?? So that I could rectify it
        am I right in doing like this???

        However just to mention, I was also using methodgen.setMaxStack
before returning the isntrumented method



>
>>      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......)
>
>i suggest mg.getMaxLocals()
>
>> 
>>      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......)
>
>i suggest mg.getMaxLocals() + 1
>
>> 
>>      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?????
>
>If the local variable table were complete and accurate, this method 
>would be correct, but you should not assume that.  
>getMaxLocals() always 
>returns a free slot (assuming you call setMaxLocals() 
>appropriately) and 
>frees you from writing your own code to find max_index.
>
>> 
>>      is there some other efficient way for doing this???
>
>getMaxLocals()
>
>> 
>>      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]

Reply via email to