Author: kohsuke Date: Wed Dec 28 17:03:25 2005 New Revision: 359670 URL: http://svn.apache.org/viewcvs?rev=359670&view=rev Log: fixed another instrumentation issue in a rather ad-hoc way. A proper fix would require more sophisticated stack analysis. for now just do a simple pattern-match to find what javac often produces. ----- // if there are any dup_x2 following new and dup, replace them with dup. // some java compiler generates such bytecode for code like // someObject.someStringField += "abc" // // which yield // NEW StringBuffer // DUP // ALOAD // someObject // DUP_x2 // GETFIELD someStringField // INVOKESPECIAL StringBuffer.<init> // LDC "abc" // INVOKEVIRTUAL StringBuffer.append // INVOKEVIRTUAL StringBuffer.toString // PUTFIELD someStringField // // replacing this DUP_x2 -> DUP is required for moving the new.
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java?rev=359670&r1=359669&r2=359670&view=diff ============================================================================== --- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java (original) +++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java Wed Dec 28 17:03:25 2005 @@ -438,6 +438,30 @@ insList.delete(next); next = newnext; } + // if there are any dup_x2 following new and dup, replace them with dup. + // some java compiler generates such bytecode for code like + // someObject.someStringField += "abc" + // + // which yield + // NEW StringBuffer + // DUP + // ALOAD // someObject + // DUP_x2 + // GETFIELD someStringField + // INVOKESPECIAL StringBuffer.<init> + // LDC "abc" + // INVOKEVIRTUAL StringBuffer.append + // INVOKEVIRTUAL StringBuffer.toString + // PUTFIELD someStringField + // + // replacing this DUP_x2 -> DUP is required for moving the new. + if(next!=null && next.getNext()!=null && next.getNext().getInstruction().getOpcode() == Constants.DUP_X2) { + InstructionHandle dupx2ptr = next.getNext(); + final InstructionHandle newnext = dupx2ptr.getNext(); + insList.insert(dupx2ptr, InstructionConstants.DUP); + insList.delete(dupx2ptr); + next = newnext; + } final InstructionTargeter[] targeter = ins.getTargeters(); if (targeter != null) { final InstructionHandle newnext = ins.getNext(); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]