[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