Re: Popping from operand stack

Arrin Daley <[email protected]> Tue, 18 Nov 2008 10:56:23 +1100
Newsgroups gmane.comp.jakarta.bcel.user
Message-ID <[email protected]>
Hi Pranav

Perhaps a better way might be to insert DUP (or some of the other DUP 
variants) after the iload? instructions so that you copy the  contents 
of the stack then you are free to do what you like with these as long as 
you return the stack to the state it was in before your instrumentation.

eg
    BYTECODES                                             STACK

   0:   iload_1					i1
   1:   iload_2					i1,i2
	DUP2					i1,12,i1,i2
	....Some code to instrument the values of i1 and i2...
						i1,i2
   2:   if_icmpeq       16
   5:   getstatic       #2; //Field		
java/lang/System.out:Ljava/io/PrintStream;
   8:   ldc     #3; //String TRUE
............ as so on.


Note in this case copying the values was easy because they were single 
word values doubles require more care and you may have to use other DUP 
bytecodes and perhaps something a bit more complicated, shouldn't be too 
bad though.

Notice the stack returns to i1,i2 if you don't return the stack to the 
same state you'll have problems.

Remember to call MethodGen.setMaxStack() when you're finished because 
you've possibly changed the maximum stack height.

Hope this helps

Bye Arrin

Pranav Kuber wrote:
> Hi,
>
> I'm new to using BCEL and have a query.
>
> I'm trying to instrument all IF instructions. So I just need to find out a
> way where I could access the operand stack constants (iload_1 and iload_2).
>
> For example, -
> if I have some code in this format
>
> if(a!=b)
>     do Something...
> else
>    do something...
>
> The corresponding bytecode generated would be -
>
>    0:   iload_1
>    1:   iload_2
>    2:   if_icmpeq       16
>    5:   getstatic       #2; //Field
> java/lang/System.out:Ljava/io/PrintStream;
>    8:   ldc     #3; //String TRUE
> ............ as so on.
>
> I need to pop iload_1 and iload_2 from the stack and store them somewhere.
>
> Is there any way I could do that?
>
> Thanks for the help.
>
> Regards,
> Pranav
>
>