[jboss-cvs] JBossAS SVN: r65755 - projects/aop/trunk/aop/src/main/org/jboss/aop/instrument.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Oct 2 09:10:34 EDT 2007


Author: flavia.rainone at jboss.com
Date: 2007-10-02 09:10:34 -0400 (Tue, 02 Oct 2007)
New Revision: 65755

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
Log:
[JBAOP-471] Bug fixed.

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-10-02 13:08:30 UTC (rev 65754)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java	2007-10-02 13:10:34 UTC (rev 65755)
@@ -62,6 +62,7 @@
    private static final Class WRITE_INVOCATION_TYPE = FieldWriteInvocation.class;
    private static final CtClass READ_INVOCATION_CT_TYPE;
    private static final CtClass WRITE_INVOCATION_CT_TYPE;
+   private static final String TYPED_VALUE_FIELD = "typedValue";
    static
    {
       try
@@ -112,6 +113,17 @@
       joinpointFieldName =
          getGeneratedJoinPointFieldName(fieldName(finfo), finfo.isRead());
    }
+   
+   /**
+    * This method will be called only when an @Arg-annotated parameter is accepted.
+    * This happens only on FieldWrite interceptions, and index value will be zero.
+    * 
+    * @param index zero value
+    */
+   protected String getJoinPointArg(int index)
+   {
+      return "this." + TYPED_VALUE_FIELD;
+   }
 
    private String fieldName(FieldInfo info)
    {
@@ -284,7 +296,7 @@
          return sb.toString();
       }
 
-      private CtClass setupClass()throws NotFoundException, CannotCompileException
+      protected CtClass setupClass()throws NotFoundException, CannotCompileException
       {
          String className = getGeneratedJoinPointClassName(advisedField.getName(), read);
 
@@ -553,12 +565,36 @@
 
    private static class WriteBaseClassGenerator extends BaseClassGenerator
    {
+      private static final String GET_VALUE = "getValue";
+      private static final String SET_VALUE = "setValue";
+      
       WriteBaseClassGenerator(GeneratedAdvisorInstrumentor instrumentor,  CtClass advisedClass,
             CtField advisedField, String finame, int index) throws NotFoundException
       {
          super(instrumentor, advisedClass, advisedField, finame, index, false);
       }
 
+      protected CtClass setupClass()throws NotFoundException, CannotCompileException
+      {
+         CtClass setUp = super.setupClass();
+         CtField valueField = new CtField(getArgumentType(), TYPED_VALUE_FIELD, setUp);
+         jp.addField(valueField);
+         CtMethod oldGetValue = WRITE_INVOCATION_CT_TYPE.getDeclaredMethod(GET_VALUE);
+         CtMethod getValue = CtNewMethod.make(oldGetValue.getReturnType(),
+               GET_VALUE, oldGetValue.getParameterTypes(),
+               oldGetValue.getExceptionTypes(), "{return ($w)" + TYPED_VALUE_FIELD + ";}",
+               setUp);
+         setUp.addMethod(getValue);
+         CtMethod oldSetValue = WRITE_INVOCATION_CT_TYPE.getDeclaredMethod(SET_VALUE);
+         CtMethod setValue = CtNewMethod.make(oldSetValue.getReturnType(),
+               GET_VALUE, oldSetValue.getParameterTypes(),
+               oldSetValue.getExceptionTypes(), "{" + TYPED_VALUE_FIELD + " = " +
+               JavassistToReflect.castInvocationValueToTypeString(getArgumentType(),
+                     "$1") + ";}", setUp);
+         setUp.addMethod(setValue);
+         return setUp;
+      }
+      
       protected CtClass getSuperClass() throws NotFoundException
       {
          return WRITE_INVOCATION_CT_TYPE;
@@ -573,9 +609,9 @@
       {
          if (hasTargetObject)
          {
-            return "   super.value = ($w)$3;";
+            return TYPED_VALUE_FIELD + " = $3;";
          }
-         return "   super.value = ($w)$2;";
+         return TYPED_VALUE_FIELD + " = $2;";
       }
 
       protected CtClass[] getInvokeJoinPointParams() throws NotFoundException
@@ -600,14 +636,11 @@
 
       protected String createInvokeNextDispatchMethodBody() throws NotFoundException
       {
-         CtClass type = advisedField.getType();
-         String value = JavassistToReflect.castInvocationValueToTypeString(type) + ";";
-
          return
             "{" +
             ((hasTargetObject) ?
-                  TYPED_TARGET_FIELD + "." + advisedField.getName() + " = " +  value:
-                     advisedClass.getName() + "." + advisedField.getName() + " = " +  value) +
+                  TYPED_TARGET_FIELD + "." + advisedField.getName() + " = " +  TYPED_VALUE_FIELD:
+                     advisedClass.getName() + "." + advisedField.getName() + " = " +  TYPED_VALUE_FIELD) +
 
             ((hasTargetObject) ?
                   "; return "  + TYPED_TARGET_FIELD + "." + advisedField.getName() + ";" :
@@ -622,18 +655,33 @@
             "{" + advisedClass.getName() + "." + advisedField.getName() + " = $1;}";
       }
       
+      protected void addArgumentFieldAndAccessor() throws CannotCompileException, NotFoundException
+      {
+         // duplicated code (See OptimizedBehaviour class)
+         CtField inconsistentArgs = new CtField(CtClass.booleanType, "inconsistentArgs",
+               jp);
+         jp.addField(inconsistentArgs, CtField.Initializer.byExpr("false"));
+         super.addArgumentFieldAndAccessor();
+         CtMethod enforceArgsConsistency = CtNewMethod.make(
+               createEnforceArgsConsistencyBody(), jp);
+         enforceArgsConsistency.setModifiers(Modifier.PROTECTED);
+         jp.addMethod(enforceArgsConsistency);
+      }
+      
       protected String createGetArgumentsBody()
       {
          StringBuffer code = new StringBuffer("public java.lang.Object[] ");
          code.append(OptimizedBehaviourInvocations.GET_ARGUMENTS);
-         code.append("(){ ");
+         code.append("(){ inconsistentArgs = true;   ");
          code.append("   if(");
          code.append(ARGUMENTS);
          code.append("  == null)");
          code.append("   {");
          code.append("      ");
          code.append(ARGUMENTS);
-         code.append(" = new java.lang.Object[]{super.value};");
+         code.append(" = new java.lang.Object[]{");
+         code.append(GET_VALUE);
+         code.append("()};");
          code.append("   }");
          code.append("   return ");
          code.append(ARGUMENTS);
@@ -646,16 +694,25 @@
       {
          StringBuffer code = new StringBuffer(
          "public void setArguments(java.lang.Object[] args)");
-         code.append("{   ");
+         code.append("{   inconsistentArgs = true;   ");
          code.append("if (args == null || args.length != 1)");
          code.append("{throw new RuntimeException(");
          code.append("\"Field write arguments must be a non-null array containing");
          code.append(" a single element: the value of the field write\");}");
          code.append(ARGUMENTS);
          code.append("=args;");
-         code.append("   super.value=args[0];");
          code.append("}");
          return code.toString();
       }
+      
+      protected String createEnforceArgsConsistencyBody()
+      {
+         StringBuffer code = new StringBuffer("public void ");
+         code.append(OptimizedBehaviourInvocations.ENFORCE_ARGS_CONSISTENCY);
+         // duplicated code (See OptimizedBehaviour class)
+         code.append("() {if(inconsistentArgs) { this.");
+         code.append(SET_VALUE).append("(").append(ARGUMENTS).append("[0]);}}");
+         return code.toString();
+      }
    }
 }

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-10-02 13:08:30 UTC (rev 65754)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-10-02 13:10:34 UTC (rev 65755)
@@ -371,6 +371,17 @@
       return ++increment;
    }
    
+   /**
+    * This method returns the code that access the joinpoint arg number
+    * <code>index</code> (for invocations).
+    * 
+    * @param index the index of the desired arg field
+    */
+   protected String getJoinPointArg(int index)
+   {
+      return "this.arg" + index;
+   }
+   
    protected abstract void initialiseJoinPointNames(JoinPointInfo info);
 
    private GeneratedClassInfo generateJoinpointClass(ClassPool pool, JoinPointInfo newInfo) throws NotFoundException,
@@ -1864,7 +1875,7 @@
             AdviceMethodProperties properties,
             JoinPointGenerator generator)
       {
-         // method that avoids more than one repeated call to ASSURE_ARGS_CONSISTENCY
+         // method that avoids more than one repeated call to ENFORCE_ARGS_CONSISTENCY
          this.consistencyEnforced = false;
          int[] args = properties.getArgs();
          
@@ -1909,8 +1920,7 @@
                beforeCall.append("();");
                consistencyEnforced = true;
             }
-            call.append("this.arg");
-            call.append(arg);
+            call.append(generator.getJoinPointArg(arg));
             return false;
          }
          return super.appendParameter(beforeCall, call, arg, adviceParam, properties, generator);




More information about the jboss-cvs-commits mailing list