summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-07-26 14:01:14 +0000
committeraclement <aclement>2005-07-26 14:01:14 +0000
commit8db7e37a1b2a2c81f977157a9c8e9470a3ff72e6 (patch)
tree60e0e3f370c868a572b279cd0b3ad21e5ffafb2d
parentbfd5c54ebde03a77dacd4395627745c718f543b8 (diff)
downloadaspectj-8db7e37a1b2a2c81f977157a9c8e9470a3ff72e6.tar.gz
aspectj-8db7e37a1b2a2c81f977157a9c8e9470a3ff72e6.zip
fixing the versioning problem. Up until now if we found no version in a class we 'assumed' it was the latest (1.5.0) - this is dumb. No version really means it is probably 1.2.0 (as the version was added for 1.2.1). These fixes mean that you can now safely check that version when reading in attributes, confident that checking for 1.5.0 *means* 1.5.0 was used to build it.
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java2
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java19
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelAttributes.java26
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelField.java4
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelMethod.java2
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java14
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java2
-rw-r--r--weaver/testdata/megatraceNoweave.jarbin3342 -> 3307 bytes
8 files changed, 44 insertions, 25 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java
index c68e8227f..580020a2e 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java
@@ -271,6 +271,8 @@ public class AspectDeclaration extends TypeDeclaration {
if (!isAbstract()) generatePerSupportMembers(classFile);
generateInlineAccessMembers(classFile);
+
+ classFile.extraAttributes.add(new EclipseAttributeAdapter(new AjAttribute.WeaverVersionInfo()));
classFile.extraAttributes.add(
new EclipseAttributeAdapter(new AjAttribute.Aspect(perClause)));
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java
index fba0d8812..f1734a9ab 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java
@@ -14,6 +14,7 @@
package org.aspectj.ajdt.internal.compiler.ast;
import java.lang.reflect.Modifier;
+import java.util.Iterator;
import org.aspectj.ajdt.internal.compiler.lookup.EclipseFactory;
import org.aspectj.ajdt.internal.core.builder.EclipseSourceContext;
@@ -204,12 +205,30 @@ public class PointcutDeclaration extends AjMethodDeclaration {
this.world = EclipseFactory.fromScopeLookupEnvironment(classScope);
if (ignoreFurtherInvestigation) return ;
classFile.extraAttributes.add(new EclipseAttributeAdapter(makeAttribute()));
+ addVersionAttributeIfNecessary(classFile);
+
if (generateSyntheticPointcutMethod) {
super.generateCode(classScope,classFile);
}
return;
}
+ /**
+ * Normally, pointcuts occur in aspects - aspects are always tagged with a weaver version attribute,
+ * see AspectDeclaration. However, pointcuts can also occur in regular classes and in this case there
+ * is no AspectDeclaration to ensure the attribute is added. So, this method adds the attribute
+ * if someone else hasn't already.
+ */
+ private void addVersionAttributeIfNecessary(ClassFile classFile) {
+ for (Iterator iter = classFile.extraAttributes.iterator(); iter.hasNext();) {
+ EclipseAttributeAdapter element = (EclipseAttributeAdapter) iter.next();
+ if (CharOperation.equals(element.getNameChars(),weaverVersionChars)) return;
+ }
+ classFile.extraAttributes.add(new EclipseAttributeAdapter(new AjAttribute.WeaverVersionInfo()));
+ }
+ private static char[] weaverVersionChars = "org.aspectj.weaver.WeaverVersion".toCharArray();
+
+
protected int generateInfoAttributes(ClassFile classFile) {
return super.generateInfoAttributes(classFile,true);
}
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelAttributes.java b/weaver/src/org/aspectj/weaver/bcel/BcelAttributes.java
index f43ab8f2b..4c3afc61b 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelAttributes.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelAttributes.java
@@ -23,6 +23,7 @@ import org.aspectj.bridge.IMessageHandler;
import org.aspectj.weaver.AjAttribute;
import org.aspectj.weaver.BCException;
import org.aspectj.weaver.ISourceContext;
+import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.AjAttribute.WeaverVersionInfo;
@@ -30,30 +31,35 @@ import org.aspectj.weaver.AjAttribute.WeaverVersionInfo;
// bcel to AjAttribute.
class BcelAttributes {
- public static List readAjAttributes(String classname,Attribute[] as, ISourceContext context,IMessageHandler msgHandler) {
+ public static List readAjAttributes(String classname,Attribute[] as, ISourceContext context,IMessageHandler msgHandler,AjAttribute.WeaverVersionInfo version) {
List l = new ArrayList();
- AjAttribute.WeaverVersionInfo version = new WeaverVersionInfo();
+
+ // first pass, look for version
+ List forSecondPass = new ArrayList();
for (int i = as.length - 1; i >= 0; i--) {
Attribute a = as[i];
if (a instanceof Unknown) {
Unknown u = (Unknown) a;
String name = u.getName();
if (name.startsWith(AjAttribute.AttributePrefix)) {
- AjAttribute attr = AjAttribute.read(version,name,u.getBytes(),context,msgHandler);
- if (attr!=null && attr instanceof AjAttribute.WeaverVersionInfo) {
- version = (AjAttribute.WeaverVersionInfo)attr;
-
- // Do a version check, this weaver can't process versions
- // from a future AspectJ (where the major number has changed)
+ if (name.endsWith(WeaverVersionInfo.AttributeName)) {
+ version = (AjAttribute.WeaverVersionInfo)AjAttribute.read(version,name,u.getBytes(),context,msgHandler);
if (version.getMajorVersion() > WeaverVersionInfo.getCurrentWeaverMajorVersion()) {
throw new BCException("Unable to continue, this version of AspectJ supports classes built with weaver version "+
WeaverVersionInfo.toCurrentVersionString()+" but the class "+classname+" is version "+version.toString());
}
- }
- if (attr!=null) l.add(attr);
+ }
+ forSecondPass.add(a);
}
}
}
+
+ for (int i = forSecondPass.size()-1; i >= 0; i--) {
+ Unknown a = (Unknown)forSecondPass.get(i);
+ String name = a.getName();
+ AjAttribute attr = AjAttribute.read(version,name,a.getBytes(),context,msgHandler);
+ if (attr!=null) l.add(attr);
+ }
return l;
}
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelField.java b/weaver/src/org/aspectj/weaver/bcel/BcelField.java
index 0ebc18de9..533b8b55d 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelField.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelField.java
@@ -36,6 +36,7 @@ final class BcelField extends ResolvedMember {
private ResolvedType[] annotationTypes;
private AnnotationX[] annotations;
private World world;
+ private BcelObjectType bcelObjectType;
BcelField(BcelObjectType declaringType, Field field) {
super(
@@ -46,6 +47,7 @@ final class BcelField extends ResolvedMember {
field.getSignature());
this.field = field;
this.world = declaringType.getResolvedTypeX().getWorld();
+ this.bcelObjectType = declaringType;
unpackAttributes(world);
checkedExceptions = UnresolvedType.NONE;
}
@@ -54,7 +56,7 @@ final class BcelField extends ResolvedMember {
private void unpackAttributes(World world) {
Attribute[] attrs = field.getAttributes();
- List as = BcelAttributes.readAjAttributes(getDeclaringType().getClassName(),attrs, getSourceContext(world),world.getMessageHandler());
+ List as = BcelAttributes.readAjAttributes(getDeclaringType().getClassName(),attrs, getSourceContext(world),world.getMessageHandler(),bcelObjectType.getWeaverVersionAttribute());
as.addAll(AtAjAttributes.readAj5FieldAttributes(field, world.resolve(getDeclaringType()), getSourceContext(world), world.getMessageHandler()));
for (Iterator iter = as.iterator(); iter.hasNext();) {
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java b/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
index 824517c5e..761245376 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
@@ -104,7 +104,7 @@ final class BcelMethod extends ResolvedMember {
private void unpackAjAttributes(World world) {
associatedShadowMunger = null;
- List as = BcelAttributes.readAjAttributes(getDeclaringType().getClassName(),method.getAttributes(), getSourceContext(world),world.getMessageHandler());
+ List as = BcelAttributes.readAjAttributes(getDeclaringType().getClassName(),method.getAttributes(), getSourceContext(world),world.getMessageHandler(),bcelObjectType.getWeaverVersionAttribute());
processAttributes(world, as);
as = AtAjAttributes.readAj5MethodAttributes(method, this, world.resolve(getDeclaringType()), preResolvedPointcut,getSourceContext(world), world.getMessageHandler());
processAttributes(world,as);
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java b/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java
index 285f2c52c..75dbd13e3 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java
@@ -72,7 +72,7 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
private ResolvedPointcutDefinition[] pointcuts = null;
private PerClause perClause = null;
private WeaverStateInfo weaverState = null;
- private AjAttribute.WeaverVersionInfo wvInfo = null;
+ private AjAttribute.WeaverVersionInfo wvInfo = AjAttribute.WeaverVersionInfo.UNKNOWN;
private List typeMungers = Collections.EMPTY_LIST;
private List declares = Collections.EMPTY_LIST;
private ResolvedMember[] privilegedAccess = null;
@@ -247,23 +247,13 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
typeMungers = new ArrayList();
declares = new ArrayList();
// Pass in empty list that can store things for readAj5 to process
- List l = BcelAttributes.readAjAttributes(javaClass.getClassName(),javaClass.getAttributes(), getResolvedTypeX().getSourceContext(),getResolvedTypeX().getWorld().getMessageHandler());
+ List l = BcelAttributes.readAjAttributes(javaClass.getClassName(),javaClass.getAttributes(), getResolvedTypeX().getSourceContext(),getResolvedTypeX().getWorld().getMessageHandler(),AjAttribute.WeaverVersionInfo.UNKNOWN);
processAttributes(l,pointcuts,false);
l = AtAjAttributes.readAj5ClassAttributes(javaClass, getResolvedTypeX(), getResolvedTypeX().getSourceContext(), getResolvedTypeX().getWorld().getMessageHandler(),isCodeStyleAspect);
processAttributes(l,pointcuts,true);
this.pointcuts = (ResolvedPointcutDefinition[])
pointcuts.toArray(new ResolvedPointcutDefinition[pointcuts.size()]);
- // Test isn't quite right, leaving this out for now...
-// if (isAspect() && wvInfo.getMajorVersion() == WeaverVersionInfo.UNKNOWN.getMajorVersion()) {
-// throw new BCException("Unable to continue, this version of AspectJ cannot use aspects as input that were built "+
-// "with an AspectJ earlier than version 1.2.1. Please rebuild class: "+javaClass.getClassName());
-// }
-
-// this.typeMungers = (BcelTypeMunger[])
-// typeMungers.toArray(new BcelTypeMunger[typeMungers.size()]);
-// this.declares = (Declare[])
-// declares.toArray(new Declare[declares.size()]);
}
diff --git a/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java b/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java
index d5108b92c..47af560ce 100644
--- a/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java
+++ b/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java
@@ -500,7 +500,7 @@ public final class LazyMethodGen {
if (enclosingClass != null && enclosingClass.getType() != null) {
context = enclosingClass.getType().getSourceContext();
}
- List as = BcelAttributes.readAjAttributes(getClassName(),attributes, context,null);
+ List as = BcelAttributes.readAjAttributes(getClassName(),attributes, context,null,AjAttribute.WeaverVersionInfo.UNKNOWN);
if (! as.isEmpty()) {
out.println(" " + as.get(0)); // XXX assuming exactly one attribute, munger...
}
diff --git a/weaver/testdata/megatraceNoweave.jar b/weaver/testdata/megatraceNoweave.jar
index 6ee827fc1..15fa0213c 100644
--- a/weaver/testdata/megatraceNoweave.jar
+++ b/weaver/testdata/megatraceNoweave.jar
Binary files differ