[prev in list] [next in list] [prev in thread] [next in thread] 

List:       bcel-user
Subject:    Re: Popping from operand stack
From:       "Pranav Kuber" <pranavkuber () gmail ! com>
Date:       2008-11-18 18:28:17
Message-ID: be3407f20811181028gfb797f2ved168a343e261c80 () mail ! gmail ! com
[Download RAW message or body]


Thanks for the help. It certainly helped me in a way.

One more query -

For the same example in the previous post,

I get

0: iload_1[27](1)
1: iload_2[28](1)

as the instruction handles for the iloads.

So from the list of instruction handles of the bytecode, I get these
instruction handles as arguments in my method.

Is there any way where I could access the operand values using instruction
handles?


Thanks,
Pranav

On Mon, Nov 17, 2008 at 10:50 PM, Dave Brosius <dbrosius@apache.org> wrote:

> Well, in general it's not going to be easy to do what you want in the
> general case, but perhaps you only care about simple cases, where
> there is only one comparison in an if, or some other restriction.
>
> In theory, the IF_CMPEQ can simply be replaced with a call to
> ALOAD x
> INVOKEVIRTUAL
>
> where x is the object that you are calling your method on,
> since in this case, the two parameters are on the top of the stack.
> in the same way that parameters would be pushed.
>
> ----- Original Message ----- From: "Pranav Kuber" <pranavkuber@gmail.com>
> To: "BCEL Users List" <bcel-user@jakarta.apache.org>
> Sent: Monday, November 17, 2008 7:09 PM
> Subject: Re: Popping from operand stack
>
>
>
>  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 <arrin.daley@anu.edu.au>
>> 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: bcel-user-unsubscribe@jakarta.apache.org
>>> For additional commands, e-mail: bcel-user-help@jakarta.apache.org
>>>
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: bcel-user-help@jakarta.apache.org
>
>


-- 
Pranav Kuber
Graduate Student in Computer Science
Georgia Institute of Technology
http://www.cc.gatech.edu/~pkuber/


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic