Return-Path: Delivered-To: apmail-jakarta-commons-dev-archive@www.apache.org Received: (qmail 20274 invoked from network); 29 Dec 2005 01:03:52 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 29 Dec 2005 01:03:52 -0000 Received: (qmail 3222 invoked by uid 500); 29 Dec 2005 01:03:50 -0000 Delivered-To: apmail-jakarta-commons-dev-archive@jakarta.apache.org Received: (qmail 2671 invoked by uid 500); 29 Dec 2005 01:03:48 -0000 Mailing-List: contact commons-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "Jakarta Commons Developers List" Reply-To: "Jakarta Commons Developers List" Delivered-To: mailing list commons-dev@jakarta.apache.org Received: (qmail 2660 invoked by uid 500); 29 Dec 2005 01:03:48 -0000 Received: (qmail 2657 invoked by uid 99); 29 Dec 2005 01:03:48 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Dec 2005 17:03:48 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Wed, 28 Dec 2005 17:03:47 -0800 Received: (qmail 20187 invoked by uid 65534); 29 Dec 2005 01:03:27 -0000 Message-ID: <20051229010327.20185.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r359670 - /jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java Date: Thu, 29 Dec 2005 01:03:27 -0000 To: commons-cvs@jakarta.apache.org From: kohsuke@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N 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. // 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. + // 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: commons-dev-unsubscribe@jakarta.apache.org For additional commands, e-mail: commons-dev-help@jakarta.apache.org