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 <[EMAIL PROTECTED]> 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" <[EMAIL PROTECTED]> > To: "BCEL Users List" <[email protected]> > 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 <[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] >>> >>> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Pranav Kuber Graduate Student in Computer Science Georgia Institute of Technology http://www.cc.gatech.edu/~pkuber/
