From 8db7e37a1b2a2c81f977157a9c8e9470a3ff72e6 Mon Sep 17 00:00:00 2001 From: aclement Date: Tue, 26 Jul 2005 14:01:14 +0000 Subject: [PATCH] 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. --- .../compiler/ast/AspectDeclaration.java | 2 ++ .../compiler/ast/PointcutDeclaration.java | 19 +++++++++++++ .../aspectj/weaver/bcel/BcelAttributes.java | 26 +++++++++++------- .../org/aspectj/weaver/bcel/BcelField.java | 4 ++- .../org/aspectj/weaver/bcel/BcelMethod.java | 2 +- .../aspectj/weaver/bcel/BcelObjectType.java | 14 ++-------- .../aspectj/weaver/bcel/LazyMethodGen.java | 2 +- weaver/testdata/megatraceNoweave.jar | Bin 3342 -> 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 6ee827fc1f40e1c46c74c81200d73d2e5648fbdb..15fa0213c542f999ee315ac0d00b0c7236e2edcc 100644 GIT binary patch delta 2739 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 delta 2768 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 W000000001Wlf4Wm2I30<0001pus+HF -- 2.39.5