Re: Re: Re: Try-catch block injection

Nikolas Nehmer <[email protected]>
Newsgroups gmane.comp.java.objectweb.asm
Message-ID <[email protected]>
Thanks for your answer. Some points are getting clearer now. But I still 
have some issues. I can't manage to catch the VerifyError even including 
the try-catch block on source code level.
If i use the following code snippet:
try {
   int xxx = 5;
} catch (VerifyError e) {
   System.out.println("Hello");
}

injecting an xLOAD before the xSTORE statement without inserting 
additional labels the vm is terminated because of an uncaught exception 
(VerifiyError). The catch-block is not executed!

InsnList list = instructions;
//currentInsnNode represents xSTORE
list.insertBefore(currentInsnNode,new VarInsnNode(Opcodes.ILOAD, 
((VarInsnNode)currentInsnNode).var));

Instead injecting an exception initialization at the same place, works 
out perfectly, i.e. the surrounding try-catch block catches and handles 
the exception.

list.insertBefore(currentInsnNode, new TypeInsnNode(Opcodes.NEW, 
"java/lang/VerifyError"));
list.insertBefore(currentInsnNode, new InsnNode(Opcodes.DUP));
list.insertBefore(currentInsnNode, new 
MethodInsnNode(Opcodes.INVOKESPECIAL, 
"java/lang/VerifyError","<init>","()V"));
list.insertBefore(currentInsnNode, new InsnNode(Opcodes.ATHROW));

Any ideas what the problem might be?

Cheers
Nikolas

Eugene Kuleshov schrieb:
>   In regards to your example, if it wasn't clear from my previous
> email you need to insert start label BEFORE wrapped block and end
> label - AFTER that block. Also your code always fall into the catch
> block (with or without the exception), so content of the stack doesn't
> match for those two cases. So, as I already suggested before, use
> ASMifier on a code compiled from a Java snipped before and after your
> transformation and you should see what I mean.
>
>   BTW, instead of loading variable you can also duplicate value used
> by xLOAD opcodes from the stack, but that will certainly affect the
> stackmap structure and maxstack value.
>
>   regards,
>   Eugene
>
>
> On Mon, Mar 22, 2010 at 10:05 AM, Nikolas Nehmer
> <[email protected]> wrote:
>   
>> 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]
>>
>>
>>     


-- 
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.