[jboss-cvs] JBossAS SVN: r60414 - in projects/aop/trunk/aop/src: test/org/jboss/test/aop/beforeafterArgs and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Feb 7 18:04:18 EST 2007


Author: flavia.rainone at jboss.com
Date: 2007-02-07 18:04:17 -0500 (Wed, 07 Feb 2007)
New Revision: 60414

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/OptimizedBehaviourInvocations.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgAspect.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgTestCase.java
Log:
[JBAOP-352] Enforcement of consistency between typed args and args array works on genadvisor invocations

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -67,7 +67,8 @@
 
    public ConByConJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info, JoinPointParameters.ONLY_ARGS);
+      super(advisor, info, JoinPointParameters.ONLY_ARGS,
+            ((ConByConInfo) info).getConstructor().getParameterTypes().length);
    }
 
    protected void initialiseJoinPointNames()

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -68,7 +68,8 @@
 
    public ConByMethodJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info, getParameters((ConByMethodInfo) info));
+      super(advisor, info, getParameters((ConByMethodInfo) info),
+            ((ConByMethodInfo) info).getConstructor().getParameterTypes().length);
    }
    
    private static JoinPointParameters getParameters(ConByMethodInfo info)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -67,7 +67,8 @@
 
    public ConstructionJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info, JoinPointParameters.TARGET_ARGS);
+      super(advisor, info, JoinPointParameters.TARGET_ARGS,
+            ((ConstructionInfo) info).getConstructor().getParameterTypes().length);
    }
 
 

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -68,7 +68,8 @@
 
    public ConstructorJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info, JoinPointParameters.ONLY_ARGS);
+      super(advisor, info, JoinPointParameters.ONLY_ARGS,
+            ((ConstructorInfo) info).getConstructor().getParameterTypes().length);
    }
 
 

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -74,7 +74,8 @@
 
    public FieldJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info, getParameters((FieldInfo) info));
+      super(advisor, info, getParameters((FieldInfo) info),
+            ((FieldInfo) info).isRead()? 0: 1);
    }
 
    private static JoinPointParameters getParameters(FieldInfo info)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -28,6 +28,8 @@
 import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
 
 import javassist.CannotCompileException;
 import javassist.ClassPool;
@@ -186,7 +188,8 @@
                {"((Short) " + ARGUMENTS + "[", "]).shortValue()"}
          };
       }
-      private final void castArgument(StringBuffer code, CtClass expectedType, int i)
+      
+      public final void castArgument(StringBuffer code, CtClass expectedType, int i)
       {
 
          if (expectedType.isPrimitive())
@@ -258,7 +261,9 @@
    protected static final String ARGUMENTS= "arguments";
    private static final String GET_ARGUMENTS= " getArguments()";
    protected static final CtClass[] EMPTY_CTCLASS_ARRAY = new CtClass[0];
-
+   private final ArrayList<Integer> joinPointArguments;
+   
+   
    private JoinPointInfo oldInfo;
    protected JoinPointInfo info;
    private JoinPointParameters parameters;
@@ -271,9 +276,10 @@
    private Field joinpointField;
    private Field generatorField;
    private boolean initialised;
+   private ThreadLocal<Set<Integer>> inconsistentTypeArgs;
    
    protected JoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info,
-         JoinPointParameters parameters)
+         JoinPointParameters parameters, int argumentsSize)
    {
       this.info = info;
       this.parameters = parameters;
@@ -290,9 +296,25 @@
             break;
          }
       }
-
+      // helper collection
+      joinPointArguments = new ArrayList<Integer>(argumentsSize);
+      // iterate once so we don't need to iterate always (use this array instead)
+      for (int i = 0; i < argumentsSize; i++)
+      {
+         joinPointArguments.add(i);
+      }
+      // joinpoint generation helper field, will contain list of typed args that are
+      // inconsistent with arguments array
+      // is ThreadLocal so we can support more than one Thread
+      // generating the a joinpoint class
+      inconsistentTypeArgs = new ThreadLocal<Set<Integer>>()
+      {
+         protected synchronized Set<Integer> initialValue() {
+            return new HashSet<Integer>();
+         }
+      };
+      
       initialiseJoinPointNames();
-   
       findAdvisedField(advisorClass, info);
    }
    
@@ -736,16 +758,16 @@
       }
       code.append("   try");
       code.append("   {");
-      boolean argsFoundBefore = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
-            setups.getBeforeSetups(), code);
+      boolean argsFoundBefore = DefaultAdviceCallStrategy.getInstance().
+         addInvokeCode(this, setups.getBeforeSetups(), code);
       // process after code
       StringBuffer afterCode = new StringBuffer();
-      boolean argsFoundAfter = addInvokeCode(AfterAdviceCallStrategy.getInstance(),
-            setups.getAfterSetups(), afterCode);
+      boolean argsFoundAfter = AfterAdviceCallStrategy.getInstance().addInvokeCode(
+            this, setups.getAfterSetups(), afterCode);
       afterCode.append("   }");
       afterCode.append("   catch(java.lang.Throwable " + THROWABLE + ")");
       afterCode.append("   {");
-      argsFoundAfter = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
+      argsFoundAfter = DefaultAdviceCallStrategy.getInstance().addInvokeCode(this,
             setups.getThrowingSetups(), afterCode) || argsFoundAfter;
       // add around according to whether @Args were found before and/or later
       addAroundInvokeCode(code, setups, joinpointClass, argsFoundBefore,
@@ -769,23 +791,6 @@
       return code.toString();
    }
 
-   private boolean addInvokeCode(AdviceCallStrategy callStrategy, AdviceSetup[] setups, StringBuffer code) throws NotFoundException
-   {
-      if (setups == null || setups.length == 0)
-      {
-         return false;
-      }
-      boolean argsFound = false;
-      String key = callStrategy.generateKey(this);
-      for (int i = 0 ; i < setups.length ; i++)
-      {
-         argsFound = callStrategy.appendAdviceCall(setups[i], key, code, this)
-            || argsFound;
-      }
-      return argsFound;
-   }
-   
-   
    private void addAroundInvokeCode(StringBuffer code, AdviceSetupsByType setups,
          CtClass joinpointClass, boolean argsFoundBefore, boolean argsFoundAfter,
          CtClass[] parameterTypes) throws NotFoundException
@@ -923,7 +928,7 @@
       body.append("{");
       body.append("   try{");
       body.append("      switch(++" + CURRENT_ADVICE + "){");
-      addInvokeCode(AroundAdviceCallStrategy.getInstance(), aroundSetups, body);
+      AroundAdviceCallStrategy.getInstance().addInvokeCode(this, aroundSetups, body);
       body.append("      default:");
       body.append("         " + returnStr + "this.dispatch();");
       body.append("      }");
@@ -1664,11 +1669,33 @@
 
    private static abstract class AdviceCallStrategy
    {
-      public abstract String generateKey(JoinPointGenerator generator);
-      public abstract boolean appendAdviceCall(AdviceSetup setup, String key,
-           StringBuffer code, JoinPointGenerator generator) throws NotFoundException;
+      public boolean addInvokeCode(JoinPointGenerator generator,
+            AdviceSetup[] setups, StringBuffer code) throws NotFoundException
+      {
+         StringBuffer call = new StringBuffer();
+         if (setups == null || setups.length == 0)
+         {
+            return false;
+         }
+         boolean argsFound = false;
+         String key = generateKey(generator);
+         for (int i = 0 ; i < setups.length ; i++)
+         {
+            call.setLength(0);
+            argsFound = appendAdviceCall(setups[i], key, code, call, generator)
+               || argsFound;
+            code.append(call);
+            call.setLength(0);
+         }
+         return argsFound;
+      }
       
-      private final boolean appendAdviceCall(AdviceSetup setup, StringBuffer code,
+      protected abstract String generateKey(JoinPointGenerator generator);
+      protected abstract boolean appendAdviceCall(AdviceSetup setup, String key,
+           StringBuffer beforeCall, StringBuffer call, JoinPointGenerator generator) throws NotFoundException;
+      
+      private final boolean appendAdviceCall(AdviceSetup setup,
+            StringBuffer beforeCall, StringBuffer call,
             boolean isAround, JoinPointGenerator generator) 
       {
          AdviceMethodProperties properties = setup.getAdviceMethodProperties();
@@ -1676,10 +1703,10 @@
          {
             return false;
          }
-         code.append(setup.getAspectFieldName());
-         code.append(".");
-         code.append(setup.getAdviceName());
-         code.append("(");
+         call.append(setup.getAspectFieldName());
+         call.append(".");
+         call.append(setup.getAdviceName());
+         call.append("(");
          
          
          final int[] args = properties.getArgs();
@@ -1687,73 +1714,86 @@
          if (args.length > 0)
          {
             final Class[] adviceParams = properties.getAdviceMethod().getParameterTypes();
-            code.append("(");
-            code.append(ClassExpression.simpleType(adviceParams[0]));
-            code.append(")");
-            argsFound = appendParameter(code, args[0], adviceParams[0], properties,
+            call.append("(");
+            call.append(ClassExpression.simpleType(adviceParams[0]));
+            call.append(")");
+            argsFound = appendParameter(beforeCall, call, args[0], adviceParams[0], properties,
                   generator);
             for (int i = 1 ; i < args.length ; i++)
             {
-               code.append(", (");
-               code.append(ClassExpression.simpleType(adviceParams[i]));
-               code.append(")");
-               argsFound = appendParameter(code, args[i], adviceParams[i],
+               call.append(", (");
+               call.append(ClassExpression.simpleType(adviceParams[i]));
+               call.append(")");
+               argsFound = appendParameter(beforeCall, call, args[i], adviceParams[i],
                      properties, generator) || argsFound;
             }
          }
          
-         code.append(");");
+         call.append(");");
          return argsFound;
       }
       
-      protected boolean appendParameter(StringBuffer code, final int arg,
-            final Class adviceParam, AdviceMethodProperties properties,
+      protected boolean appendParameter(StringBuffer beforeCall, StringBuffer call,
+            final int arg, final Class adviceParam, AdviceMethodProperties properties,
             JoinPointGenerator generator)
       {
          switch(arg)
          {
          case AdviceMethodProperties.INVOCATION_ARG:
-            code.append("this");
+            call.append("this");
             break;
          case AdviceMethodProperties.JOINPOINT_ARG:
-            code.append(INFO_FIELD);
+            call.append(INFO_FIELD);
             break;
          case AdviceMethodProperties.RETURN_ARG:
-            code.append(RETURN_VALUE);
+            call.append(RETURN_VALUE);
             break;
          case AdviceMethodProperties.THROWABLE_ARG:
-            code.append(THROWABLE);
+            call.append(THROWABLE);
             break;
          case AdviceMethodProperties.TARGET_ARG:
             if (!generator.parameters.hasTarget())
             {
-               code.append("null");
+               call.append("null");
             }
             else
             {
-               code.append('$');
-               code.append(generator.parameters.getTargetIndex());
+               call.append('$');
+               call.append(generator.parameters.getTargetIndex());
             }
             break;
          case AdviceMethodProperties.CALLER_ARG:
             if (!generator.parameters.hasCaller())
             {
-               code.append("null");
+               call.append("null");
             }
             else
             {
-               code.append('$');
-               code.append(generator.parameters.getCallerIndex());
+               call.append('$');
+               call.append(generator.parameters.getCallerIndex());
             }
             break;
          case AdviceMethodProperties.ARGS_ARG:
-            code.append(ARGUMENTS);
+            call.append(ARGUMENTS);
+            // all typed args may become inconsistent with arguments array after
+            // advice call
+            generator.inconsistentTypeArgs.get().addAll(generator.joinPointArguments);
             // return true when args has been found; false otherwise
             return true;
          default:
+            // make typed argument consistent, if that is the case
+            Set<Integer> inconsistentTypeArgs = generator.inconsistentTypeArgs.get();
+            int argIndex = arg + generator.parameters.getFirstArgIndex();
+            if (inconsistentTypeArgs.contains(arg))
+            {
+               beforeCall.append("$").append(argIndex).append(" = ");
+               beforeCall.append(ReflectToJavassist.castInvocationValueToTypeString(properties.getJoinpointParameters()[arg], ARGUMENTS + '[' + arg + ']'));
+               beforeCall.append(';');
+               inconsistentTypeArgs.remove(arg);
+            }
             //The parameter array is 1-based, and the invokeJoinPoint method may also take the target and caller objects
-            code.append("$");
-            code.append(arg + generator.parameters.getFirstArgIndex());
+            call.append("$");
+            call.append(arg + generator.parameters.getFirstArgIndex());
          }
          return false;
       }
@@ -1856,6 +1896,7 @@
       private AroundAdviceCallStrategy() {}
       
       private int addedAdvice = 0;
+      private boolean consistencyEnforced = false;
       
       public String generateKey(JoinPointGenerator generator)
       {
@@ -1868,7 +1909,7 @@
       }
       
       public boolean appendAdviceCall(AdviceSetup setup, String key,
-            StringBuffer code, JoinPointGenerator generator)
+            StringBuffer beforeCall, StringBuffer call, JoinPointGenerator generator)
       {
          if (!setup.shouldInvokeAspect())
          {
@@ -1886,37 +1927,40 @@
             return false;
          }
          
-         code.append("      case ");
-         code.append(++addedAdvice);
-         code.append(":");
+         beforeCall.append("      case ");
+         beforeCall.append(++addedAdvice);
+         beforeCall.append(":");
          
          if (setup.getCFlowString() != null)
          {
-            code.append("         if (matchesCflow" + setup.useCFlowFrom() + ")");
-            code.append("         {");
-            result = appendAroundCallString(code, key, setup, properties, generator);
-            code.append("         }");
-            code.append("         else");
-            code.append("         {");
-            code.append("            ");
-            code.append(key);
-            code.append(" invokeNext();");
-            code.append("         }");
+            beforeCall.append("         if (matchesCflow" + setup.useCFlowFrom() + ")");
+            beforeCall.append("         {");
+            result = appendAroundCallString(beforeCall, call, key, setup, properties, generator);
+            call.append("         }");
+            call.append("         else");
+            call.append("         {");
+            call.append("            ");
+            call.append(key);
+            call.append(" invokeNext();");
+            call.append("         }");
          }
          else
          {
-            result = appendAroundCallString(code, key, setup, properties, generator);
+            result = appendAroundCallString(beforeCall, call, key, setup, properties, generator);
          }
          
-         code.append("      break;");
+         call.append("      break;");
          return result;
       }
       
       
-      public boolean appendAroundCallString(StringBuffer invokeNextBody,
-            String returnStr, AdviceSetup setup, AdviceMethodProperties properties,
+      public boolean appendAroundCallString(StringBuffer beforeCall,
+            StringBuffer call, String returnStr, AdviceSetup setup,
+            AdviceMethodProperties properties,
             JoinPointGenerator generator)
       {
+         // method that avoids more than one repeated call to ASSURE_ARGS_CONSISTENCY
+         this.consistencyEnforced = false;
          int[] args = properties.getArgs();
          
          final boolean firstParamIsInvocation =
@@ -1924,56 +1968,62 @@
 
          if (!firstParamIsInvocation)
          {
-            invokeNextBody.append("try{");
-            invokeNextBody.append("   org.jboss.aop.joinpoint.CurrentInvocation.push(this); ");
+            call.append("try{");
+            call.append("   org.jboss.aop.joinpoint.CurrentInvocation.push(this); ");
          }
-         invokeNextBody.append("   ");
-         invokeNextBody.append(returnStr);
-         invokeNextBody.append(" ");
-         boolean result = super.appendAdviceCall(setup, invokeNextBody, true,
+         call.append("   ");
+         call.append(returnStr);
+         call.append(" ");
+         boolean result = super.appendAdviceCall(setup, beforeCall, call, true,
                generator);
          
          if (!firstParamIsInvocation)
          {
-            invokeNextBody.append("}finally{");
-            invokeNextBody.append("   org.jboss.aop.joinpoint.CurrentInvocation.pop(); ");
-            invokeNextBody.append("}");
+            call.append("}finally{");
+            call.append("   org.jboss.aop.joinpoint.CurrentInvocation.pop(); ");
+            call.append("}");
          }
          return result;
       }
       
-      protected boolean appendParameter(StringBuffer code, final int arg,
-            final Class adviceParam, AdviceMethodProperties properties,
-            JoinPointGenerator generator)
+      protected boolean appendParameter(StringBuffer beforeCall, StringBuffer call,
+            final int arg, final Class adviceParam,
+            AdviceMethodProperties properties, JoinPointGenerator generator)
       {
          switch(arg)
          {
          case AdviceMethodProperties.TARGET_ARG:
             if (generator.parameters.hasTarget())
             {
-               code.append(TARGET_FIELD);
+               call.append(TARGET_FIELD);
                return false;
             }
             break;
          case AdviceMethodProperties.CALLER_ARG:
             if (generator.parameters.hasCaller())
             {
-               code.append(CALLER_FIELD);
+               call.append(CALLER_FIELD);
                return false;
             }
             break;
          case AdviceMethodProperties.ARGS_ARG:
-            code.append(GET_ARGUMENTS);
+            call.append(GET_ARGUMENTS);
             // return true when args has been found; false otherwise
             return true;
          }
          if (arg >= 0)
          {
-            code.append("this.arg");
-            code.append(arg);
+            if (!consistencyEnforced)
+            {
+               beforeCall.append(OptimizedBehaviourInvocations.ENFORCE_ARGS_CONSISTENCY);
+               beforeCall.append("();");
+               consistencyEnforced = true;
+            }
+            call.append("this.arg");
+            call.append(arg);
             return false;
          }
-         return super.appendParameter(code, arg, adviceParam, properties, generator);
+         return super.appendParameter(beforeCall, call, arg, adviceParam, properties, generator);
       } 
    }
    
@@ -1994,9 +2044,9 @@
       }
       
       public boolean appendAdviceCall(AdviceSetup setup, String key,
-            StringBuffer code, JoinPointGenerator generator)
+            StringBuffer beforeCall, StringBuffer call, JoinPointGenerator generator)
       {
-         return super.appendAdviceCall(setup, code, false, generator);
+         return super.appendAdviceCall(setup, beforeCall, call, false, generator);
       }
    }
    
@@ -2022,14 +2072,14 @@
       }
 
       public boolean appendAdviceCall(AdviceSetup setup, String key,
-            StringBuffer code, JoinPointGenerator generator) throws NotFoundException
+            StringBuffer beforeCall, StringBuffer call, JoinPointGenerator generator) throws NotFoundException
       {
          AdviceMethodProperties properties = setup.getAdviceMethodProperties();
          if (properties != null && !properties.isAdviceVoid())
          {
-            code.append(key);
+            call.append(key);
          }
-         return super.appendAdviceCall(setup, code, false, generator);
+         return super.appendAdviceCall(setup, beforeCall, call, false, generator);
       }
    }
 }
\ No newline at end of file

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -61,7 +61,8 @@
 
    public MethodByConJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info, getParameters((MethodByConInfo) info));
+      super(advisor, info, getParameters((MethodByConInfo) info),
+            ((MethodByConInfo) info).getMethod().getParameterTypes().length);
    }
    
    private static JoinPointParameters getParameters(MethodByConInfo info)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -61,7 +61,8 @@
 
    public MethodByMethodJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info, getParameters((MethodByMethodInfo) info));
+      super(advisor, info, getParameters((MethodByMethodInfo) info),
+            ((MethodByMethodInfo) info).getMethod().getParameterTypes().length);
    }
 
    private static JoinPointParameters getParameters(MethodByMethodInfo info)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -62,7 +62,8 @@
 
    public MethodJoinPointGenerator(GeneratedClassAdvisor advisor, MethodInfo info)
    {
-      super(advisor, info, getParameters((MethodInfo) info));
+      super(advisor, info, getParameters((MethodInfo) info),
+            ((MethodInfo) info).getAdvisedMethod().getParameterTypes().length);
    }
    
    private static JoinPointParameters getParameters(MethodInfo info)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/OptimizedBehaviourInvocations.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/OptimizedBehaviourInvocations.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/OptimizedBehaviourInvocations.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -41,6 +41,13 @@
  */
 public abstract class OptimizedBehaviourInvocations extends OptimizedInvocations
 {
+   /**
+    * Name of method that enforces consistency between the values contained in typed
+    * argument fields and those contained in arguments array.
+    * This method is added to all optimized invocations that contain arguments field.
+    */
+   public static final String ENFORCE_ARGS_CONSISTENCY = "enforceArgsConsistency";
+
    protected static final String INVOKE_TARGET = "invokeTarget";
    
    /**
@@ -74,6 +81,7 @@
       addArgumentFieldsToInvocation(invocation, params);
       addGetArguments(pool, invocation, params, hasMarshalledArguments);
       addSetArguments(pool, invocation, params);
+      addEnforceArgsConsistency(invocation, params);
    }
    
    /**
@@ -107,26 +115,14 @@
    {
       StringBuffer sb = new StringBuffer("{");
       sb.append(beforeDispatch);
+      sb.append(ENFORCE_ARGS_CONSISTENCY).append("();");
+      sb.append(dispatchLine);
       if (params.length == 0)
       {
-         sb.append(dispatchLine);
          sb.append("();");
       }
       else
       {
-         sb.append("  if (inconsistentArgs){");
-         sb.append(dispatchLine);
-         sb.append('(');
-         sb.append(JavassistToReflect.castInvocationValueToTypeString(params[0],
-               "arguments[0]"));
-         for (int i = 1; i < params.length; i++)
-         {
-            sb.append(", ");
-            sb.append(JavassistToReflect.castInvocationValueToTypeString(params[i],
-                  "arguments[" + i + "]"));
-         }
-         sb.append(");}   else {");
-         sb.append(dispatchLine);
          sb.append("(arg0");
          for (int i = 1; i < params.length; i++)
          {
@@ -134,7 +130,7 @@
             sb.append("arg");
             sb.append(i);
          }
-         sb.append(");} ");
+         sb.append(");");
       }
       sb.append(afterDispatch);
       sb.append("}");
@@ -280,6 +276,56 @@
         //Field invocations don't have a getArguments() method, that's fine
       } 
    }
+   
+   /**
+    * Creates a method called <code>enforceArgsConsistency</code>, and adds this
+    * method to <code>invocation</code>
+    * <p>
+    * This method is responsible for updating typed argument fields with the current
+    * values of <code>arguments</code>, if they are different.
+    * 
+    * @param invocation optimized invocation class
+    * @param params     joinpoint parameter types
+    * 
+    * @throws CannotCompileException
+    */
+   private static void addEnforceArgsConsistency(CtClass invocation, CtClass[] params)
+      throws CannotCompileException
+   {
+      StringBuffer code = new StringBuffer();
+      code.append("{ ");
+      if (params.length != 0)
+      {
+         code.append("if(inconsistentArgs) {");
+         code.append("arg0 = ");
+         code.append(JavassistToReflect.castInvocationValueToTypeString(params[0],
+               "arguments[0]"));
+         for (int i = 1; i < params.length; i++)
+         {
+            code.append("; arg").append(i).append('=');
+            code.append(JavassistToReflect.castInvocationValueToTypeString(params[i],
+                  "arguments[" + i + "]"));
+         }
+         code.append("; }");
+      }
+      code.append('}');
+      
+      CtMethod assureArgsConsistency = null;
+      try
+      {
+         assureArgsConsistency = CtNewMethod.make(
+               CtClass.voidType, ENFORCE_ARGS_CONSISTENCY,
+               new CtClass[0],
+               new CtClass[0], code.toString(),
+               invocation);
+      }
+      catch(CannotCompileException e)
+      {
+         System.out.println(code.toString());
+         throw e;
+      }
+      invocation.addMethod(assureArgsConsistency); 
+   }
 
    /** Adds fields arg0, arg1 etc. to the invocation class for storing the parameters for a method
     * 

Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgAspect.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgAspect.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgAspect.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -144,7 +144,6 @@
       Object[] arguments = invocation.getArguments();
       arguments[0] = Integer.valueOf(((Integer) arguments[0]).intValue() - 8);
       arguments[4] = Integer.valueOf(((Integer) arguments[4]).intValue() + 51);
-      invocation.setArguments(arguments);
       return invocation.invokeNext();
    }
    

Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgTestCase.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgTestCase.java	2007-02-07 23:02:29 UTC (rev 60413)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgTestCase.java	2007-02-07 23:04:17 UTC (rev 60414)
@@ -64,12 +64,8 @@
 
    public void test1()
    {
-      int result = this.pojo.bunch(5, (double) 1.3, (float) 0, "test1", 1);
+      assertEquals(52, this.pojo.bunch(5, (double) 1.3, (float) 0, "test1", 1));
       
-      
-      // TODO solve [JBAOP-35] and uncomment these lines
-      // assertEquals(value, result);
-      
       assertTrue(ArgAspect.before1);
       assertTrue(ArgAspect.before2);
       assertTrue(ArgAspect.before3);
@@ -83,12 +79,12 @@
       assertEquals(5, ArgAspect.before1X);
       assertEquals(5, ArgAspect.before2X);
       assertEquals(1, ArgAspect.before3Y);
-      //assertEquals(25, ArgAspect.before5X);
-      //assertEquals(-17, ArgAspect.before5Y);
+      assertEquals(25, ArgAspect.before5X);
+      assertEquals(-17, ArgAspect.before5Y);
       assertEquals(17, ArgAspect.around5X);
       assertEquals(34, ArgAspect.around5Y);
-      //assertEquals(17, ArgAspect.after1X);
-      //assertEquals(17, ArgAspect.after4X);
-      //assertEquals(34, ArgAspect.after4Y);  
+      assertEquals(17, ArgAspect.after1X);
+      assertEquals(17, ArgAspect.after4X);
+      assertEquals(34, ArgAspect.after4Y);  
    }
 }
\ No newline at end of file




More information about the jboss-cvs-commits mailing list