[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