Hello,
I have a Problem with my compiler extension. The
InterprocConstantPropagator thorws an IndexOutOfBounceException from
the method findUsedArguments(SootMethod method) in line 229.
------------------------------------------------
private boolean[] findUsedArguments(SootMethod method) {
if (!method.makeRef().toString().equals(methodSig))
throw new InternalCompilerError("");
boolean[] result=new boolean[method.getParameterCount()];
Body body=method.getActiveBody();
Chain statements=body.getUnits().getNonPatchingChain();
Set usedLocals=new HashSet();
for (Iterator it=body.getUseBoxes().iterator(); it.hasNext(); ) {
ValueBox b=(ValueBox)it.next();
if (b.getValue() instanceof Local)
usedLocals.add(b.getValue());
}
int index=0;
for (Iterator itSt=statements.iterator(); itSt.hasNext();) {
Stmt s=(Stmt)itSt.next();
if (s instanceof IdentityStmt) {
IdentityStmt ids=(IdentityStmt)s;
if (ids.getRightOp() instanceof ParameterRef) {
result[index]=usedLocals.contains(ids.getLeftOp());
index++;
}
} else
break;
}
return result;
}
------------------------------------------------
My extension is based on the JastAdd frontend of abc-1.3.0. This
exception is always thrown when an advice does not apply anywhere.
For all advices i check in my compiler extension if they are allowed
to match to certain joinpoints. When they are not allowed to match i
change the pointcut of the advice to a never matching pointcut. When i
do this the named exception is thrown. I experienced with several
pointcut expressions and the result is:
------------------------------------------------
AdviceDecl {
....
// No global Pointcut exists so create a never matching pointcut
ArgsPointcutExpr argsPointcut = new ArgsPointcutExpr(bindings);
IfPointcutExpr ifPointcut = new IfPointcutExpr(new
BooleanLiteral(false));
pointcutExpr = new AndPointcutExpr(argsPointcut,ifPointcut);
List<FormalPattern> formalPatterns = new List<FormalPattern>();
formalPatterns.add(new WildcardFormalPattern());
MethodPattern methodPattern = new MethodPattern(
new List<ModifierPattern>(),
new SimpleNamePattern("*"),
new DotNamePattern(new ExplicitTypeNamePattern(new
TypeAccess("System")), new SimpleNamePattern("*")),
formalPatterns,
new List<Pattern>()
);
pointcutExpr = new AndPointcutExpr(pointcutExpr, new
CallPointcutExpr(methodPattern));
setPointcutExpr(pointcutExpr);
...
}
------------------------------------------------
Here I simply created a pointcut : call(* System.*(..)) &&
args(<advice arguments>) && if(false)
I found out what the problem is but not how to solve it. Perhaps
someone can give me a hint.
The Problem is that when an advice which is modified by my compiler
extension is passed to the findUsedArguments method it contains only
one parameterType
[java.lang.String]
but 2 IdentityStmt
[test := @parameter0: java.lang.String, thisJoinPoint := @parameter1:
org.aspectj.lang.JoinPoint, return]
So the result[boolean] has only length 1 but accessed is result[0] and
result[1].
Do anyone know how to solve this problem?
Thanks in advanced?
Greetings,
Thomas
Received on Tue Apr 29 2008 - 12:55:02 BST
This archive was generated by hypermail 2.2.0 : Tue Apr 29 2008 - 14:20:11 BST