Re: Re: Try-catch block injection

Nikolas Nehmer <[email protected]>
Newsgroups gmane.comp.java.objectweb.asm
Message-ID <[email protected]>
By basic idea is as follows:
I try to log local variable access...logging the "old" variable value. 
To achieve that goal, a method's bytecode is parsed and the following 
code is injected (in this case for an ISTORE op) - passing the 
variable's stack frame position and the old value to my logger. The 
currentIsnsNode in that case would be the ISTORE.

tempList.add(new LdcInsnNode(((VarInsnNode)currentInsnNode).var));
tempList.add(new VarInsnNode(Opcodes.ILOAD, 
((VarInsnNode)currentInsnNode).var));
tempList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, 
logger,localLogger, ("(II)V")));

Unfortunately, thr ILOAD might throw a VerifyError if the local variable 
is not initialized. To cope with that situation, I would like to 
surround the code block inserted for logging, with a try catch block, 
catching the VerifyError and passing a "default" value to the logger 
instead of loading the current value.

thanks in advance!
Nikolas

Eugene Kuleshov schrieb:
>   Not sure what suggestion you are looking for, but your code is
> incomplete to drive any conclusions (e.g. what's the
> currentInsnNode?).
>   I'd suggest to forget about stackmap frames for now, it is going to
> work without them just fine and you can get back to them when you get
> a better grip on a bytecode.
>   Also, write your java code before and after transformation and use
> ASMifier to get the code to generate bytecodes, so you can compare
> what changes.
>
>  Anyways, from what I read, your code is transforming this:
>
>   currentInsnNode
>
>   into this:
>
>
>   {
>     startLabel (created by you)
>     endLabel (created by you)
>   } catch(Throwable e) {
>      logger.testTryCatch();
>   }
>   currentInsnNode
>   ...
>
>   Note that you also are NOT consuming the exception value off the stack.
>
>   regards,
>   Eugene
>
>
> On Mon, Mar 22, 2010 at 9:03 AM, Nikolas Nehmer
> <[email protected]> wrote:
>   
>> Hi,
>>
>> I'm trying to do the following transformation based on bytecode injection:
>>
>> startLabel:
>> foo...;
>> endLabel
>>
>> into
>>
>> try {
>>   startLabel:
>>   foo...;
>>   endLabel
>> } catch (VerifyError e) {
>>   //doSomething;
>> }
>>
>> Currently, my code looks like this (raising a java.lang.ClassFormatError):
>>
>> LabelNode startLabel = new LabelNode();
>> tempList.add(startLabel);
>>                  LabelNode endLabel = new LabelNode();
>> tempList.add(endLabel);
>>                  //catch block
>> int numberOfLocalVariables = 0;
>> Object[] localVariableTypes = new Object[0];
>> int numberOfStackElements = 0;
>> Object[] stackElementTypes = new Object[0];
>> tempList.add(new FrameNode(Opcodes.F_FULL, numberOfLocalVariables,
>> localVariableTypes, numberOfStackElements, stackElementTypes));
>> tempList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, logger,"testTryCatch",
>> ("()V")));
>>
>> list.insertBefore(currentInsnNode, tempList);
>>          list.insert(new FrameNode(Opcodes.F_SAME, numberOfLocalVariables,
>> localVariableTypes, numberOfStackElements, stackElementTypes));
>> tryCatchBlocks.add(new TryCatchBlockNode(startLabel, endLabel, endLabel,
>> "java/lang/Throwable"));
>>
>> Any suggestions?
>>
>> Cheers
>> Nikolas
>>
>>
>> --
>> You receive this message as a subscriber of the [email protected] mailing list.
>> To unsubscribe: mailto:[email protected]
>> For general help: mailto:[email protected]?subject=help
>> OW2 mailing lists service home page: http://www.ow2.org/wws
>>
>>
>>     


-- 
Dipl.-Inf. Nikolas Nehmer,
Dept. of Computer Science. University of Kaiserslautern 
P.O. Box 3049, 67653 Kaiserslautern, Germany.
room 36/308, phone: +49 (0) 631 - 205 2644, fax: +49 (0) 631 - 205 3299
mail: [email protected]
message-footer.txt (text/plain, 238 B)
-- 
You receive this message as a subscriber of the [email protected] mailing list.
To unsubscribe: mailto:[email protected]
For general help: mailto:[email protected]?subject=help
OW2 mailing lists service home page: http://www.ow2.org/wws
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.