]> source.dussan.org Git - aspectj.git/commitdiff
from branch: modified parameter code for @AJ
authoraclement <aclement>
Tue, 19 Apr 2005 12:26:04 +0000 (12:26 +0000)
committeraclement <aclement>
Tue, 19 Apr 2005 12:26:04 +0000 (12:26 +0000)
weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java

index 948fc536aa1264c3010a51e0bcff78c96f601c77..813cf82324a0d28ce273f898b03d2173f1593121 100644 (file)
@@ -1,13 +1,14 @@
 /* *******************************************************************
  * 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 
+ * 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
+ *     Alexandre Vasseur    support for @AJ aspects
  * ******************************************************************/
 
 
@@ -34,6 +35,7 @@ import org.aspectj.weaver.Shadow;
 import org.aspectj.weaver.TypeX;
 import org.aspectj.weaver.WeaverMessages;
 import org.aspectj.weaver.World;
+import org.aspectj.weaver.ataspectj.Ajc5MemberMaker;
 import org.aspectj.weaver.ast.Literal;
 import org.aspectj.weaver.ast.Test;
 import org.aspectj.weaver.patterns.ExactTypePattern;
@@ -150,6 +152,9 @@ public class BcelAdvice extends Advice {
         } else if (getKind() == AdviceKind.Around) {
                if (!canInline(s)) {
                        shadow.weaveAroundClosure(this, hasDynamicTests());
+                //FIXME : check Inlining and LTW
+                //ALEX : uncomment to force inlining for LTW - else inlining does not seems to happen.
+                //shadow.weaveAroundInline(this, hasDynamicTests());
                } else {
                shadow.weaveAroundInline(this, hasDynamicTests());
                }
@@ -218,6 +223,22 @@ public class BcelAdvice extends Advice {
                return thrownExceptions;
        }
 
+    /**
+     * The munger must not check for the advice exceptions to be declared by the shadow in the case
+     * of @AJ aspects so that around can throws Throwable
+     *
+     * @return
+     */
+    public boolean mustCheckExceptions() {
+        if (getConcreteAspect() == null) {
+            //FIXME Alex: not sure this is good to default to that.
+            // dig when do we reach that ie not yet concretized
+            return true;
+        }
+        return !getConcreteAspect().isAnnotationStyleAspect();
+    }
+
+
 
     // only call me after prepare has been called
     public boolean hasDynamicTests() {
@@ -308,38 +329,75 @@ public class BcelAdvice extends Advice {
         for (int i = 0, len = exposedState.size(); i < len; i++) {
                if (exposedState.isErroneousVar(i)) continue; // Erroneous vars have already had error msgs reported!
             BcelVar v = (BcelVar) exposedState.get(i);
-            if (v == null) continue;
-            TypeX desiredTy = getSignature().getParameterTypes()[i];
-            v.appendLoadAndConvert(il, fact, desiredTy.resolve(world));
-        }
 
-        
-               if (getKind() == AdviceKind.Around) {
-                       il.append(closureInstantiation);
-               } else if (hasExtraParameter()) {
-                       extraVar.appendLoadAndConvert(
-                               il,
-                               fact,
-                               getExtraParameterType().resolve(world));
-               }
-        
-        // handle thisJoinPoint parameters
-        // these need to be in that same order as parameters in 
-        // org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration
-        if ((getExtraParameterFlags() & ThisJoinPointStaticPart) != 0) {
-               shadow.getThisJoinPointStaticPartBcelVar().appendLoad(il, fact);
-        }
-        
-        if ((getExtraParameterFlags() & ThisJoinPoint) != 0) {
-               il.append(shadow.loadThisJoinPoint());
+            if (v == null) {
+                // if not @AJ aspect, go on with the regular binding handling
+               if (!Ajc5MemberMaker.isAnnotationStyleAspect(getConcreteAspect())) {
+                       continue;
+               } else {
+                    // ATAJ: for @AJ aspects, handle implicit binding of xxJoinPoint
+                       if (getKind() == AdviceKind.Around) {
+                           il.append(closureInstantiation);
+                           continue;
+                       } else if ("Lorg/aspectj/lang/JoinPoint$StaticPart;".equals(getSignature().getParameterTypes()[i].getSignature())) {
+                           if ((getExtraParameterFlags() & ThisJoinPointStaticPart) != 0) {
+                               shadow.getThisJoinPointStaticPartBcelVar().appendLoad(il, fact);
+                           }
+                       } else if ("Lorg/aspectj/lang/JoinPoint;".equals(getSignature().getParameterTypes()[i].getSignature())) {
+                           if ((getExtraParameterFlags() & ThisJoinPoint) != 0) {
+                               il.append(shadow.loadThisJoinPoint());
+                           }
+                       } else if ("Lorg/aspectj/lang/JoinPoint$EnclosingStaticPart;".equals(getSignature().getParameterTypes()[i].getSignature())) {
+                           if ((getExtraParameterFlags() & ThisEnclosingJoinPointStaticPart) != 0) {
+                               shadow.getThisEnclosingJoinPointStaticPartBcelVar().appendLoad(il, fact);
+                           }
+                       } else if (hasExtraParameter()) {
+                           extraVar.appendLoadAndConvert(
+                               il,
+                               fact,
+                               getExtraParameterType().resolve(world));
+                       } else {
+                        //FIXME this code  will throw an error if ProceedingJP is used in a before advice f.e. ok ??
+                        throw new Error("Should not happen - unbound advice argument at index " + i + " in [" +
+                                toString() + "]");
+                       }
+               }
+            } else {
+                TypeX desiredTy = getSignature().getParameterTypes()[i];
+                v.appendLoadAndConvert(il, fact, desiredTy.resolve(world));
+            }
         }
+
         
+        // ATAJ: for code style aspect, handles the extraFlag as usual ie not
+        // in the middle of the formal bindings but at the end, in a rock solid ordering
+        if (!Ajc5MemberMaker.isAnnotationStyleAspect(getConcreteAspect())) {
+            if (getKind() == AdviceKind.Around) {
+                il.append(closureInstantiation);
+            } else if (hasExtraParameter()) {
+                extraVar.appendLoadAndConvert(
+                    il,
+                    fact,
+                    getExtraParameterType().resolve(world));
+            }
 
-        if ((getExtraParameterFlags() & ThisEnclosingJoinPointStaticPart) != 0) {
-               shadow.getThisEnclosingJoinPointStaticPartBcelVar().appendLoad(il, fact);
+            // handle thisJoinPoint parameters
+            // these need to be in that same order as parameters in
+            // org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration
+            if ((getExtraParameterFlags() & ThisJoinPointStaticPart) != 0) {
+                shadow.getThisJoinPointStaticPartBcelVar().appendLoad(il, fact);
+            }
+
+            if ((getExtraParameterFlags() & ThisJoinPoint) != 0) {
+                il.append(shadow.loadThisJoinPoint());
+            }
+
+            if ((getExtraParameterFlags() & ThisEnclosingJoinPointStaticPart) != 0) {
+                shadow.getThisEnclosingJoinPointStaticPartBcelVar().appendLoad(il, fact);
+            }
         }
-        
-        
+
+
         return il;
     }
     
@@ -419,6 +477,12 @@ public class BcelAdvice extends Advice {
        }
 
        public BcelVar[] getExposedStateAsBcelVars() {
+        // ATAJ aspect
+        // the closure instantiation has the same mapping as the extracted method from wich it is called
+        if (getConcreteAspect()!= null && getConcreteAspect().isAnnotationStyleAspect()) {
+            return BcelVar.NONE;
+        }
+
                //System.out.println("vars: " + Arrays.asList(exposedState.vars));
                if (exposedState == null) return BcelVar.NONE;
                int len = exposedState.vars.length;