Re: Re: Try-catch block injection
Eugene Kuleshov <[email protected]>
| Newsgroups | gmane.comp.java.objectweb.asm |
|---|---|
| Message-ID | <[email protected]> |
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] > >
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