bcel-user

[Prev] Thread [Next]  |  [Prev] Date [Next]

Re: Popping from operand stack Pranav Kuber Mon Nov 17 17:00:23 2008

Thanks for the help.

Actually, I want to completely replace the if instruction with my code. So
at runtime, instead of calling the if instruction if_icmpeq, my code shall
get executed. So I just need the values from the stack to make a method call
passing these two values as arguments, thus, bypassing the if instruction.

-Pranav

On Mon, Nov 17, 2008 at 6:56 PM, Arrin Daley <[EMAIL PROTECTED]> wrote:

> 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
>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>