diff options
17 files changed, 472 insertions, 185 deletions
diff --git a/lib/test/aspectjrt.jar b/lib/test/aspectjrt.jar Binary files differindex 7e4e30f0f..7254363af 100644 --- a/lib/test/aspectjrt.jar +++ b/lib/test/aspectjrt.jar diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java index aa40a8242..cf6174746 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java @@ -442,6 +442,8 @@ public class BuildArgParser extends Main { buildConfig.setNoWeave(true); } else if (arg.equals("-XserializableAspects")) { buildConfig.setXserializableAspects(true); + } else if (arg.equals("-XlazyTjp")) { + buildConfig.setXlazyTjp(true); } else if (arg.equals("-XnoInline")) { buildConfig.setXnoInline(true); } else if (arg.equals("-Xlintfile")) { diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java index a106f1424..ad182a589 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java @@ -54,6 +54,7 @@ public class AjBuildConfig { // XXX needs bootclasspath? private boolean emacsSymMode = false; private boolean noWeave = false; private boolean XserializableAspects = false; + private boolean XlazyTjp = false; private boolean XnoInline = false; private String lintMode = AJLINT_DEFAULT; private File lintSpecFile = null; @@ -452,4 +453,13 @@ public class AjBuildConfig { // XXX needs bootclasspath? public void doNotProceed() { shouldProceed = false; } + + public boolean isXlazyTjp() { + return XlazyTjp; + } + + public void setXlazyTjp(boolean b) { + XlazyTjp = b; + } + } diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java index 1ab91d09e..89fc57071 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java @@ -187,6 +187,7 @@ public class AjBuildManager { private void initBcelWorld(IMessageHandler handler) throws IOException { bcelWorld = new BcelWorld(buildConfig.getClasspath(), handler, null); bcelWorld.setXnoInline(buildConfig.isXnoInline()); + bcelWorld.setXlazyTjp(buildConfig.isXlazyTjp()); bcelWeaver = new BcelWeaver(bcelWorld); for (Iterator i = buildConfig.getAspectpath().iterator(); i.hasNext();) { diff --git a/org.aspectj.ajdt.core/testdata/src1/LazyTjp.aj b/org.aspectj.ajdt.core/testdata/src1/LazyTjp.aj new file mode 100644 index 000000000..f3662738c --- /dev/null +++ b/org.aspectj.ajdt.core/testdata/src1/LazyTjp.aj @@ -0,0 +1,142 @@ +public class LazyTjp {
+
+ private static final int N = 10000000;
+ // if lazy tjp is working, then calling the advice that uses thisJoinPoint should
+ // take at least this much longer than using an if pcd to bypass the advice
+ private static final double minimumRatio = 8.0;
+
+ public static void main(String[] args) {
+ Trace.enabled = false;
+ double tOff = timeIt(); // throw the first result out for warm-up
+ tOff = timeIt();
+ Trace.enabled = true;
+ double tOn = timeIt();
+ Trace.enabled = false;
+ double tEasy = timeIt0();
+ double tGone = timeIt1();
+
+ System.out.println("tOff: " + tOff + ", tOn: " + tOn + ", tEasy: " + tEasy + ", tGone: " + tGone);
+ System.out.println("ratio: " + tOn/tOff);
+
+ Trace.enabled = false;
+ double tOff2 = timeIt2();
+ tOff2 = timeIt2();
+ Trace.enabled = true;
+ double tOn2 = timeIt2();
+
+ System.out.println("tOff2: " + tOff2 + ", tOn2: " + tOn2);
+ System.out.println("ratio2: " + tOn2/tOff2);
+
+
+ if (tOn/tOff < minimumRatio) {
+ throw new IllegalStateException("tOn/tOff = " + tOn/tOff + " < " + minimumRatio);
+ }
+ }
+
+ public static double timeIt() {
+ long start = System.currentTimeMillis();
+
+ for (int i=0; i < N; i++) {
+ doit(i);
+ }
+
+ long stop = System.currentTimeMillis();
+ return (stop-start)/1000.0;
+ }
+
+ private static int doit(int x) {
+ return x+1;
+ }
+
+ public static double timeIt0() {
+ long start = System.currentTimeMillis();
+
+ for (int i=0; i < N; i++) {
+ doit0(i);
+ }
+
+ long stop = System.currentTimeMillis();
+ return (stop-start)/1000.0;
+ }
+
+ private static int doit0(int x) {
+ return x+1;
+ }
+
+ public static double timeIt1() {
+ long start = System.currentTimeMillis();
+
+ for (int i=0; i < N; i++) {
+ doit1(i);
+ }
+
+ long stop = System.currentTimeMillis();
+ return (stop-start)/1000.0;
+ }
+
+ private static int doit1(int x) {
+ return x+1;
+ }
+
+ public static double timeIt2() {
+ long start = System.currentTimeMillis();
+
+ for (int i=0; i < N; i++) {
+ doit2(i);
+ }
+
+ long stop = System.currentTimeMillis();
+ return (stop-start)/1000.0;
+ }
+
+ private static int doit2(int x) {
+ return x+1;
+ }
+
+ private static int doit3(int x) {
+ return x+1;
+ }
+}
+
+aspect Trace {
+ public static boolean enabled = false;
+
+ public static int counter = 0;
+
+ pointcut traced(): if (enabled) && execution(* LazyTjp.doit(..));
+
+ before(): traced() {
+ Object[] args = thisJoinPoint.getArgs();
+ counter += args.length;
+ }
+
+ before(): execution(* LazyTjp.doit0(..)) {
+ counter += 1;
+ }
+
+ pointcut traced2(): if (enabled) && execution(* LazyTjp.doit2(..));
+
+ before(): traced2() {
+ Object[] args = thisJoinPoint.getArgs();
+ counter += args.length;
+ }
+
+ after() returning: traced2() {
+ Object[] args = thisJoinPoint.getArgs();
+ counter += args.length;
+ }
+
+
+ pointcut traced3(): if (enabled) && execution(* LazyTjp.doit3(..));
+
+ before(): traced3() {
+ Object[] args = thisJoinPoint.getArgs();
+ counter += args.length;
+ }
+
+ Object around(): traced3() { // expect Xlint warning in -XlazyTjp mode
+ return proceed();
+ }
+
+
+}
\ No newline at end of file diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/AjdtBatchTests.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/AjdtBatchTests.java index 8075e9888..80710268c 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/AjdtBatchTests.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/AjdtBatchTests.java @@ -25,7 +25,8 @@ public class AjdtBatchTests extends TestCase { //$JUnit-BEGIN$ suite.addTestSuite(BasicCommandTestCase.class); suite.addTestSuite(BinaryFormsTestCase.class); - suite.addTestSuite(CompileAndRunTestCase.class); + suite.addTestSuite(CompileAndRunTestCase.class); + suite.addTestSuite(PerformanceTestCase.class); suite.addTestSuite(ImageTestCase.class); suite.addTestSuite(MultipleCompileTestCase.class); // XXX suite.addTestSuite(VerifyWeaveTestCase.class); diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CommandTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CommandTestCase.java index c50ac5c89..a508e512c 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CommandTestCase.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CommandTestCase.java @@ -45,6 +45,10 @@ public abstract class CommandTestCase extends TestCase { public static void checkCompile(String source, int[] expectedErrors) { + checkCompile(source, new String[0], expectedErrors); + } + + public static void checkCompile(String source, String[] extraArgs, int[] expectedErrors) { List args = new ArrayList(); args.add("-verbose"); @@ -58,6 +62,10 @@ public abstract class CommandTestCase extends TestCase { args.add("-g"); //XXX need this to get sourcefile and line numbers, shouldn't + for (int i = 0; i < extraArgs.length; i++) { + args.add(extraArgs[i]); + } + args.add(AjdtAjcTests.TESTDATA_PATH + "/" + source); runCompiler(args, expectedErrors); diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/PerformanceTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/PerformanceTestCase.java new file mode 100644 index 000000000..527fe9304 --- /dev/null +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/PerformanceTestCase.java @@ -0,0 +1,42 @@ +/* ******************************************************************* + * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * PARC initial implementation + * ******************************************************************/ + +package org.aspectj.ajdt.internal.compiler.batch; + +import java.io.IOException; + +import org.aspectj.testing.util.TestUtil; + + +public class PerformanceTestCase extends CommandTestCase { + + public PerformanceTestCase(String name) { + super(name); + } + + + // this is a nice test, but not strictly needed + public void xxx_testLazyTjpOff() throws IOException { + checkCompile("src1/LazyTjp.aj", NO_ERRORS); + try { + TestUtil.runMain("out", "LazyTjp"); + fail("expected an exception when running without -XlazyTjp"); + } catch (IllegalStateException e) { + // expected exception thrown when no -XlazyTjp + } + } + + public void testLazyTjp() throws IOException { + checkCompile("src1/LazyTjp.aj", new String[] {"-XlazyTjp","-Xlint:error"}, new int[] {97}); + TestUtil.runMain("out", "LazyTjp"); + } +} diff --git a/runtime/src/org/aspectj/runtime/reflect/Factory.java b/runtime/src/org/aspectj/runtime/reflect/Factory.java index 781286389..44f03d686 100644 --- a/runtime/src/org/aspectj/runtime/reflect/Factory.java +++ b/runtime/src/org/aspectj/runtime/reflect/Factory.java @@ -40,11 +40,31 @@ public final class Factory { return new JoinPointImpl.StaticPartImpl(kind, sig, makeSourceLoc(l, -1)); } - public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, - Object _this, Object target, Object[] args) - { - return new JoinPointImpl(staticPart, _this, target, args); - } + private static Object[] NO_ARGS = new Object[0]; + public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, + Object _this, Object target) + { + return new JoinPointImpl(staticPart, _this, target, NO_ARGS); + } + + public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, + Object _this, Object target, Object arg0) + { + return new JoinPointImpl(staticPart, _this, target, new Object[] {arg0}); + } + + public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, + Object _this, Object target, Object arg0, Object arg1) + { + return new JoinPointImpl(staticPart, _this, target, new Object[] {arg0, arg1}); + } + + + public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, + Object _this, Object target, Object[] args) + { + return new JoinPointImpl(staticPart, _this, target, args); + } public MethodSignature makeMethodSig(String stringRep) { MethodSignatureImpl ret = new MethodSignatureImpl(stringRep); diff --git a/weaver/src/org/aspectj/weaver/Lint.java b/weaver/src/org/aspectj/weaver/Lint.java index 5a2d1c566..c9fc271cd 100644 --- a/weaver/src/org/aspectj/weaver/Lint.java +++ b/weaver/src/org/aspectj/weaver/Lint.java @@ -50,6 +50,9 @@ public class Lint { public final Kind unmatchedSuperTypeInCall = new Kind("unmatchedSuperTypeInCall", "does not match because declaring type is {0}, if match desired use target({1})"); + public final Kind canNotImplementLazyTjp = + new Kind("canNotImplementLazyTjp", "can not implement lazyTjp on this joinpoint {0} because around advice is used"); + public Lint(World world) { this.world = world; } diff --git a/weaver/src/org/aspectj/weaver/World.java b/weaver/src/org/aspectj/weaver/World.java index 289c5ae7f..481778532 100644 --- a/weaver/src/org/aspectj/weaver/World.java +++ b/weaver/src/org/aspectj/weaver/World.java @@ -41,6 +41,7 @@ public abstract class World { protected Lint lint = new Lint(this); protected boolean XnoInline; + protected boolean XlazyTjp; protected World() { super(); @@ -367,6 +368,14 @@ public abstract class World { public void setXnoInline(boolean xnoInline) { XnoInline = xnoInline; } + + public boolean isXlazyTjp() { + return XlazyTjp; + } + + public void setXlazyTjp(boolean b) { + XlazyTjp = b; + } public ResolvedTypeX.Name lookupOrCreateName(TypeX ty) { String signature = ty.getSignature(); @@ -378,4 +387,5 @@ public abstract class World { return ret; } + } diff --git a/weaver/src/org/aspectj/weaver/XlintDefault.properties b/weaver/src/org/aspectj/weaver/XlintDefault.properties index 10da55a66..7ddba894d 100644 --- a/weaver/src/org/aspectj/weaver/XlintDefault.properties +++ b/weaver/src/org/aspectj/weaver/XlintDefault.properties @@ -8,3 +8,5 @@ typeNotExposedToWeaver = warning shadowNotInStructure = ignore unmatchedSuperTypeInCall = warning + +canNotImplementLazyTjp = warning
\ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java index 88b1e9b7c..65b90ef2e 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java @@ -92,7 +92,7 @@ public class BcelAdvice extends Advice { } if ((getExtraParameterFlags() & ThisJoinPoint) != 0) { - ((BcelShadow)shadow).getThisJoinPointVar(); + ((BcelShadow)shadow).requireThisJoinPoint(pointcutTest != Literal.TRUE && getKind() != AdviceKind.Around); } if ((getExtraParameterFlags() & ThisEnclosingJoinPointStaticPart) != 0) { @@ -298,7 +298,7 @@ public class BcelAdvice extends Advice { } if ((getExtraParameterFlags() & ThisJoinPoint) != 0) { - shadow.getThisJoinPointBcelVar().appendLoad(il, fact); + il.append(shadow.loadThisJoinPoint()); } diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java index 081d9f634..9069c915e 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java @@ -43,6 +43,7 @@ import org.apache.bcel.generic.SWAP; import org.apache.bcel.generic.TargetLostException; import org.apache.bcel.generic.Type; import org.aspectj.bridge.ISourceLocation; +import org.aspectj.weaver.Advice; import org.aspectj.weaver.AdviceKind; import org.aspectj.weaver.AjcMemberMaker; import org.aspectj.weaver.BCException; @@ -248,11 +249,15 @@ public class BcelShadow extends Shadow { } // now we ask each munger to request our state + isThisJoinPointLazy = world.isXlazyTjp(); + for (Iterator iter = mungers.iterator(); iter.hasNext();) { ShadowMunger munger = (ShadowMunger) iter.next(); munger.specializeOn(this); } + initializeThisJoinPoint(); + // If we are an expression kind, we require our target/arguments on the stack // before we do our actual thing. However, they may have been removed // from the stack as the shadowMungers have requested state. @@ -765,12 +770,11 @@ public class BcelShadow extends Shadow { // reflective thisJoinPoint support private BcelVar thisJoinPointVar = null; + private boolean isThisJoinPointLazy; + private int lazyTjpConsumers = 0; private BcelVar thisJoinPointStaticPartVar = null; // private BcelVar thisEnclosingJoinPointStaticPartVar = null; - public final Var getThisJoinPointVar() { - return getThisJoinPointBcelVar(); - } public final Var getThisJoinPointStaticPartVar() { return getThisJoinPointStaticPartBcelVar(); } @@ -778,36 +782,144 @@ public class BcelShadow extends Shadow { return getThisEnclosingJoinPointStaticPartBcelVar(); } - public BcelVar getThisJoinPointBcelVar() { + public void requireThisJoinPoint(boolean hasGuardTest) { + if (!hasGuardTest) { + isThisJoinPointLazy = false; + } else { + lazyTjpConsumers++; + } if (thisJoinPointVar == null) { - thisJoinPointVar = genTempVar(TypeX.forName("org.aspectj.lang.JoinPoint")); - InstructionFactory fact = getFactory(); - InstructionList il = new InstructionList(); - BcelVar staticPart = getThisJoinPointStaticPartBcelVar(); - staticPart.appendLoad(il, fact); - if (hasThis()) { - ((BcelVar)getThisVar()).appendLoad(il, fact); - } else { - il.append(new ACONST_NULL()); - } - if (hasTarget()) { - ((BcelVar)getTargetVar()).appendLoad(il, fact); - } else { - il.append(new ACONST_NULL()); - } - il.append(makeArgsObjectArray()); - - il.append(fact.createInvoke("org.aspectj.runtime.reflect.Factory", - "makeJP", LazyClassGen.tjpType, - new Type[] { LazyClassGen.staticTjpType, - Type.OBJECT, Type.OBJECT, new ArrayType(Type.OBJECT, 1)}, - Constants.INVOKESTATIC)); - il.append(thisJoinPointVar.createStore(fact)); - range.insert(il, Range.OutsideBefore); + thisJoinPointVar = genTempVar(TypeX.forName("org.aspectj.lang.JoinPoint")); } + } + + + public Var getThisJoinPointVar() { + requireThisJoinPoint(false); return thisJoinPointVar; } + void initializeThisJoinPoint() { + if (thisJoinPointVar == null) return; + + if (isThisJoinPointLazy) { + isThisJoinPointLazy = checkLazyTjp(); + } + + if (isThisJoinPointLazy) { + createThisJoinPoint(); // make sure any state needed is initialized, but throw the instructions out + + if (lazyTjpConsumers == 1) return; // special case only one lazyTjpUser + + InstructionFactory fact = getFactory(); + InstructionList il = new InstructionList(); + il.append(InstructionConstants.ACONST_NULL); + il.append(thisJoinPointVar.createStore(fact)); + range.insert(il, Range.OutsideBefore); + } else { + InstructionFactory fact = getFactory(); + InstructionList il = createThisJoinPoint(); + il.append(thisJoinPointVar.createStore(fact)); + range.insert(il, Range.OutsideBefore); + } + } + + private boolean checkLazyTjp() { + // check for around advice + for (Iterator i = mungers.iterator(); i.hasNext();) { + ShadowMunger munger = (ShadowMunger) i.next(); + if (munger instanceof Advice) { + if ( ((Advice)munger).getKind() == AdviceKind.Around) { + world.getLint().canNotImplementLazyTjp.signal( + new String[] {toString()}, + getSourceLocation(), + new ISourceLocation[] { munger.getSourceLocation() } + ); + return false; + } + } + } + + return true; + } + + InstructionList loadThisJoinPoint() { + InstructionFactory fact = getFactory(); + InstructionList il = new InstructionList(); + + if (isThisJoinPointLazy) { + il.append(createThisJoinPoint()); + + if (lazyTjpConsumers > 1) { + il.append(thisJoinPointVar.createStore(fact)); + + InstructionHandle end = il.append(thisJoinPointVar.createLoad(fact)); + + il.insert(InstructionFactory.createBranchInstruction(Constants.IFNONNULL, end)); + il.insert(thisJoinPointVar.createLoad(fact)); + } + } else { + thisJoinPointVar.appendLoad(il, fact); + } + + return il; + } + + InstructionList createThisJoinPoint() { + InstructionFactory fact = getFactory(); + InstructionList il = new InstructionList(); + + BcelVar staticPart = getThisJoinPointStaticPartBcelVar(); + staticPart.appendLoad(il, fact); + if (hasThis()) { + ((BcelVar)getThisVar()).appendLoad(il, fact); + } else { + il.append(new ACONST_NULL()); + } + if (hasTarget()) { + ((BcelVar)getTargetVar()).appendLoad(il, fact); + } else { + il.append(new ACONST_NULL()); + } + + switch(getArgCount()) { + case 0: + il.append(fact.createInvoke("org.aspectj.runtime.reflect.Factory", + "makeJP", LazyClassGen.tjpType, + new Type[] { LazyClassGen.staticTjpType, + Type.OBJECT, Type.OBJECT}, + Constants.INVOKESTATIC)); + break; + case 1: + ((BcelVar)getArgVar(0)).appendLoadAndConvert(il, fact, world.resolve(ResolvedTypeX.OBJECT)); + il.append(fact.createInvoke("org.aspectj.runtime.reflect.Factory", + "makeJP", LazyClassGen.tjpType, + new Type[] { LazyClassGen.staticTjpType, + Type.OBJECT, Type.OBJECT, Type.OBJECT}, + Constants.INVOKESTATIC)); + break; + case 2: + ((BcelVar)getArgVar(0)).appendLoadAndConvert(il, fact, world.resolve(ResolvedTypeX.OBJECT)); + ((BcelVar)getArgVar(1)).appendLoadAndConvert(il, fact, world.resolve(ResolvedTypeX.OBJECT)); + il.append(fact.createInvoke("org.aspectj.runtime.reflect.Factory", + "makeJP", LazyClassGen.tjpType, + new Type[] { LazyClassGen.staticTjpType, + Type.OBJECT, Type.OBJECT, Type.OBJECT, Type.OBJECT}, + Constants.INVOKESTATIC)); + break; + default: + il.append(makeArgsObjectArray()); + il.append(fact.createInvoke("org.aspectj.runtime.reflect.Factory", + "makeJP", LazyClassGen.tjpType, + new Type[] { LazyClassGen.staticTjpType, + Type.OBJECT, Type.OBJECT, new ArrayType(Type.OBJECT, 1)}, + Constants.INVOKESTATIC)); + break; + } + + return il; + } + public BcelVar getThisJoinPointStaticPartBcelVar() { if (thisJoinPointStaticPartVar == null) { Field field = getEnclosingClass().getTjpField(this); diff --git a/weaver/testdata/TjpAround2HelloWorld.txt b/weaver/testdata/TjpAround2HelloWorld.txt index 7f43db752..3531db917 100644 --- a/weaver/testdata/TjpAround2HelloWorld.txt +++ b/weaver/testdata/TjpAround2HelloWorld.txt @@ -9,27 +9,23 @@ public class HelloWorld extends java.lang.Object: GETSTATIC HelloWorld.ajc$tjp_0 Lorg/aspectj/lang/JoinPoint$StaticPart; ALOAD_0 ALOAD_0 - BIPUSH 0 - ANEWARRAY java.lang.Object - ASTORE_2 - ALOAD_2 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; ASTORE_1 constructor-execution(void HelloWorld.<init>()) | BIPUSH 2 | ANEWARRAY java.lang.Object - | ASTORE 4 - | ALOAD 4 + | ASTORE_3 + | ALOAD_3 | BIPUSH 0 | ALOAD_0 | AASTORE - | ALOAD 4 + | ALOAD_3 | BIPUSH 1 | ALOAD_1 | AASTORE | NEW HelloWorld$AjcClosure3 | DUP - | ALOAD 4 + | ALOAD_3 | INVOKESPECIAL HelloWorld$AjcClosure3.<init> ([Ljava/lang/Object;)V | ALOAD_1 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; @@ -40,37 +36,30 @@ public class HelloWorld extends java.lang.Object: public static void main(String[]): ALOAD_0 - ASTORE 11 + ASTORE 9 GETSTATIC HelloWorld.ajc$tjp_3 Lorg/aspectj/lang/JoinPoint$StaticPart; ACONST_NULL ACONST_NULL - BIPUSH 1 - ANEWARRAY java.lang.Object - ASTORE 13 - ALOAD 13 - BIPUSH 0 - ALOAD 11 - AASTORE - ALOAD 13 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - ASTORE 12 + ALOAD 9 + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + ASTORE 10 method-execution(void HelloWorld.main(java.lang.String[])) | BIPUSH 2 | ANEWARRAY java.lang.Object - | ASTORE 15 - | ALOAD 15 + | ASTORE 12 + | ALOAD 12 | BIPUSH 0 - | ALOAD 11 + | ALOAD 9 | AASTORE - | ALOAD 15 - | BIPUSH 1 | ALOAD 12 + | BIPUSH 1 + | ALOAD 10 | AASTORE | NEW HelloWorld$AjcClosure15 | DUP - | ALOAD 15 - | INVOKESPECIAL HelloWorld$AjcClosure15.<init> ([Ljava/lang/Object;)V | ALOAD 12 + | INVOKESPECIAL HelloWorld$AjcClosure15.<init> ([Ljava/lang/Object;)V + | ALOAD 10 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; | POP | RETURN @@ -208,65 +197,54 @@ public class HelloWorld extends java.lang.Object: GETSTATIC HelloWorld.ajc$tjp_1 Lorg/aspectj/lang/JoinPoint$StaticPart; ACONST_NULL ACONST_NULL - BIPUSH 0 - ANEWARRAY java.lang.Object + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; ASTORE_2 - ALOAD_2 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - ASTORE 4 field-get(java.io.PrintStream java.lang.System.out) | BIPUSH 1 | ANEWARRAY java.lang.Object - | ASTORE 6 - | ALOAD 6 - | BIPUSH 0 + | ASTORE 4 | ALOAD 4 + | BIPUSH 0 + | ALOAD_2 | AASTORE | NEW HelloWorld$AjcClosure7 | DUP - | ALOAD 6 - | INVOKESPECIAL HelloWorld$AjcClosure7.<init> ([Ljava/lang/Object;)V | ALOAD 4 + | INVOKESPECIAL HelloWorld$AjcClosure7.<init> ([Ljava/lang/Object;)V + | ALOAD_2 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; | CHECKCAST java.io.PrintStream field-get(java.io.PrintStream java.lang.System.out) LDC "hello world" (line 9) + ASTORE 6 ASTORE 8 - ASTORE 10 GETSTATIC HelloWorld.ajc$tjp_2 Lorg/aspectj/lang/JoinPoint$StaticPart; ACONST_NULL - ALOAD 10 - BIPUSH 1 - ANEWARRAY java.lang.Object - ASTORE 12 - ALOAD 12 - BIPUSH 0 ALOAD 8 - AASTORE - ALOAD 12 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - ASTORE 14 + ALOAD 6 + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + ASTORE 10 method-call(void java.io.PrintStream.println(java.lang.String)) | BIPUSH 3 | ANEWARRAY java.lang.Object - | ASTORE 16 - | ALOAD 16 + | ASTORE 12 + | ALOAD 12 | BIPUSH 0 - | ALOAD 10 + | ALOAD 8 | AASTORE - | ALOAD 16 + | ALOAD 12 | BIPUSH 1 - | ALOAD 8 + | ALOAD 6 | AASTORE - | ALOAD 16 + | ALOAD 12 | BIPUSH 2 - | ALOAD 14 + | ALOAD 10 | AASTORE | NEW HelloWorld$AjcClosure11 | DUP - | ALOAD 16 + | ALOAD 12 | INVOKESPECIAL HelloWorld$AjcClosure11.<init> ([Ljava/lang/Object;)V - | ALOAD 14 + | ALOAD 10 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; | POP method-call(void java.io.PrintStream.println(java.lang.String)) diff --git a/weaver/testdata/TjpAroundHelloWorld.txt b/weaver/testdata/TjpAroundHelloWorld.txt index 90581cd64..65ca8bc5e 100644 --- a/weaver/testdata/TjpAroundHelloWorld.txt +++ b/weaver/testdata/TjpAroundHelloWorld.txt @@ -9,27 +9,23 @@ public class HelloWorld extends java.lang.Object: GETSTATIC HelloWorld.ajc$tjp_0 Lorg/aspectj/lang/JoinPoint$StaticPart; ALOAD_0 ALOAD_0 - BIPUSH 0 - ANEWARRAY java.lang.Object - ASTORE_2 - ALOAD_2 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; ASTORE_1 constructor-execution(void HelloWorld.<init>()) | BIPUSH 2 | ANEWARRAY java.lang.Object - | ASTORE_3 - | ALOAD_3 + | ASTORE_2 + | ALOAD_2 | BIPUSH 0 | ALOAD_0 | AASTORE - | ALOAD_3 + | ALOAD_2 | BIPUSH 1 | ALOAD_1 | AASTORE | NEW HelloWorld$AjcClosure1 | DUP - | ALOAD_3 + | ALOAD_2 | INVOKESPECIAL HelloWorld$AjcClosure1.<init> ([Ljava/lang/Object;)V | ALOAD_1 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; @@ -40,37 +36,30 @@ public class HelloWorld extends java.lang.Object: public static void main(String[]): ALOAD_0 - ASTORE 9 + ASTORE 7 GETSTATIC HelloWorld.ajc$tjp_3 Lorg/aspectj/lang/JoinPoint$StaticPart; ACONST_NULL ACONST_NULL - BIPUSH 1 - ANEWARRAY java.lang.Object - ASTORE 11 - ALOAD 11 - BIPUSH 0 - ALOAD 9 - AASTORE - ALOAD 11 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - ASTORE 10 + ALOAD 7 + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + ASTORE 8 method-execution(void HelloWorld.main(java.lang.String[])) | BIPUSH 2 | ANEWARRAY java.lang.Object - | ASTORE 12 - | ALOAD 12 - | BIPUSH 0 + | ASTORE 9 | ALOAD 9 + | BIPUSH 0 + | ALOAD 7 | AASTORE - | ALOAD 12 + | ALOAD 9 | BIPUSH 1 - | ALOAD 10 + | ALOAD 8 | AASTORE | NEW HelloWorld$AjcClosure7 | DUP - | ALOAD 12 + | ALOAD 9 | INVOKESPECIAL HelloWorld$AjcClosure7.<init> ([Ljava/lang/Object;)V - | ALOAD 10 + | ALOAD 8 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; | POP | RETURN @@ -142,65 +131,54 @@ public class HelloWorld extends java.lang.Object: GETSTATIC HelloWorld.ajc$tjp_1 Lorg/aspectj/lang/JoinPoint$StaticPart; ACONST_NULL ACONST_NULL - BIPUSH 0 - ANEWARRAY java.lang.Object + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; ASTORE_2 - ALOAD_2 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - ASTORE 4 field-get(java.io.PrintStream java.lang.System.out) | BIPUSH 1 | ANEWARRAY java.lang.Object - | ASTORE 6 - | ALOAD 6 - | BIPUSH 0 + | ASTORE 4 | ALOAD 4 + | BIPUSH 0 + | ALOAD_2 | AASTORE | NEW HelloWorld$AjcClosure3 | DUP - | ALOAD 6 - | INVOKESPECIAL HelloWorld$AjcClosure3.<init> ([Ljava/lang/Object;)V | ALOAD 4 + | INVOKESPECIAL HelloWorld$AjcClosure3.<init> ([Ljava/lang/Object;)V + | ALOAD_2 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; | CHECKCAST java.io.PrintStream field-get(java.io.PrintStream java.lang.System.out) LDC "hello world" (line 9) + ASTORE 6 ASTORE 8 - ASTORE 10 GETSTATIC HelloWorld.ajc$tjp_2 Lorg/aspectj/lang/JoinPoint$StaticPart; ACONST_NULL - ALOAD 10 - BIPUSH 1 - ANEWARRAY java.lang.Object - ASTORE 12 - ALOAD 12 - BIPUSH 0 ALOAD 8 - AASTORE - ALOAD 12 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - ASTORE 14 + ALOAD 6 + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + ASTORE 10 method-call(void java.io.PrintStream.println(java.lang.String)) | BIPUSH 3 | ANEWARRAY java.lang.Object - | ASTORE 16 - | ALOAD 16 + | ASTORE 12 + | ALOAD 12 | BIPUSH 0 - | ALOAD 10 + | ALOAD 8 | AASTORE - | ALOAD 16 + | ALOAD 12 | BIPUSH 1 - | ALOAD 8 + | ALOAD 6 | AASTORE - | ALOAD 16 + | ALOAD 12 | BIPUSH 2 - | ALOAD 14 + | ALOAD 10 | AASTORE | NEW HelloWorld$AjcClosure5 | DUP - | ALOAD 16 + | ALOAD 12 | INVOKESPECIAL HelloWorld$AjcClosure5.<init> ([Ljava/lang/Object;)V - | ALOAD 14 + | ALOAD 10 | INVOKESTATIC Aspect.ajc_around (Lorg/aspectj/runtime/internal/AroundClosure;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/Object; | POP method-call(void java.io.PrintStream.println(java.lang.String)) diff --git a/weaver/testdata/TjpBeforeHelloWorld.txt b/weaver/testdata/TjpBeforeHelloWorld.txt index 07649f713..ce462ec68 100644 --- a/weaver/testdata/TjpBeforeHelloWorld.txt +++ b/weaver/testdata/TjpBeforeHelloWorld.txt @@ -9,11 +9,7 @@ public class HelloWorld extends java.lang.Object: GETSTATIC HelloWorld.ajc$tjp_0 Lorg/aspectj/lang/JoinPoint$StaticPart; ALOAD_0 ALOAD_0 - BIPUSH 0 - ANEWARRAY java.lang.Object - ASTORE_2 - ALOAD_2 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; ASTORE_1 constructor-execution(void HelloWorld.<init>()) | ALOAD_1 @@ -24,31 +20,20 @@ public class HelloWorld extends java.lang.Object: public static void main(String[]): ALOAD_0 - ASTORE 9 + ASTORE 6 GETSTATIC HelloWorld.ajc$tjp_3 Lorg/aspectj/lang/JoinPoint$StaticPart; ACONST_NULL ACONST_NULL - BIPUSH 1 - ANEWARRAY java.lang.Object - ASTORE 8 - ALOAD 8 - BIPUSH 0 - ALOAD 9 - AASTORE - ALOAD 8 - INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - ASTORE 7 + ALOAD 6 + INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + ASTORE 5 method-execution(void HelloWorld.main(java.lang.String[])) - | ALOAD 7 + | ALOAD 5 | INVOKESTATIC Aspect.ajc_before (Lorg/aspectj/lang/JoinPoint;)V | GETSTATIC HelloWorld.ajc$tjp_1 Lorg/aspectj/lang/JoinPoint$StaticPart; | ACONST_NULL | ACONST_NULL - | BIPUSH 0 - | ANEWARRAY java.lang.Object - | ASTORE_2 - | ALOAD_2 - | INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + | INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; | ASTORE_1 | field-get(java.io.PrintStream java.lang.System.out) | | ALOAD_1 @@ -56,26 +41,19 @@ public class HelloWorld extends java.lang.Object: | | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 8) | field-get(java.io.PrintStream java.lang.System.out) | LDC "hello world" (line 9) + | ASTORE_3 | ASTORE 4 - | ASTORE 5 | GETSTATIC HelloWorld.ajc$tjp_2 Lorg/aspectj/lang/JoinPoint$StaticPart; | ACONST_NULL - | ALOAD 5 - | BIPUSH 1 - | ANEWARRAY java.lang.Object - | ASTORE 6 - | ALOAD 6 - | BIPUSH 0 | ALOAD 4 - | AASTORE - | ALOAD 6 - | INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; - | ASTORE_3 + | ALOAD_3 + | INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP (Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint; + | ASTORE_2 | method-call(void java.io.PrintStream.println(java.lang.String)) - | | ALOAD_3 + | | ALOAD_2 | | INVOKESTATIC Aspect.ajc_before (Lorg/aspectj/lang/JoinPoint;)V - | | ALOAD 5 | | ALOAD 4 + | | ALOAD_3 | | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V | method-call(void java.io.PrintStream.println(java.lang.String)) | RETURN (line 11) |