diff options
author | jhugunin <jhugunin> | 2004-01-24 02:28:54 +0000 |
---|---|---|
committer | jhugunin <jhugunin> | 2004-01-24 02:28:54 +0000 |
commit | 0c833438dadeeb26659cd901870d18d2c103658b (patch) | |
tree | cbe369e1ea2e90cdfabf09f9b343da4e9a930621 /weaver | |
parent | 2b4e2512530a5d0a12e92071eb2e3198722dcd6b (diff) | |
download | aspectj-0c833438dadeeb26659cd901870d18d2c103658b.tar.gz aspectj-0c833438dadeeb26659cd901870d18d2c103658b.zip |
Implemented feature for Bugzilla Bug 48091
Lazy instantiation of thisJoinPoint
Speed-ups of 10-100X are measured even when running a small test case with minimal GC issues.
The actual feature implemented is that thisJoinPoint objects are only created just before calling the method for advice that requires them. To take advantage of this feature you must use an if PCD or some other dynamic test that occurs in the PCD not the advice body to guard the expensive creation of the thisJoinPoint object.
-XlazyTjp flag must be passed to compiler to enable this feature.
If any around advice is present on the joinpoint then lazy instantiation
will be disabled. An Xlint warning will be displayed in this case.
As a related optimization, several helper methods were added to
Factory.makeJP to reduce the code size when thisJoinPoint is used.
Diffstat (limited to 'weaver')
-rw-r--r-- | weaver/src/org/aspectj/weaver/Lint.java | 3 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/World.java | 10 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/XlintDefault.properties | 2 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java | 4 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelShadow.java | 168 | ||||
-rw-r--r-- | weaver/testdata/TjpAround2HelloWorld.txt | 92 | ||||
-rw-r--r-- | weaver/testdata/TjpAroundHelloWorld.txt | 92 | ||||
-rw-r--r-- | weaver/testdata/TjpBeforeHelloWorld.txt | 48 |
8 files changed, 240 insertions, 179 deletions
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) |