[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