Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 24382 Details for
Bug 98901
Must copy annotations to *public* intertype declarations
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
fixes all 29 cases
weaver.txt (text/plain), 27.53 KB, created by
Andrew J Huff
on 2005-07-06 10:28:35 EDT
(
hide
)
Description:
fixes all 29 cases
Filename:
MIME Type:
Creator:
Andrew J Huff
Created:
2005-07-06 10:28:35 EDT
Size:
27.53 KB
patch
obsolete
>Index: src/org/aspectj/weaver/AjcMemberMaker.java >=================================================================== >RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/AjcMemberMaker.java,v >retrieving revision 1.15 >diff -u -r1.15 AjcMemberMaker.java >--- src/org/aspectj/weaver/AjcMemberMaker.java 20 May 2005 12:27:59 -0000 1.15 >+++ src/org/aspectj/weaver/AjcMemberMaker.java 6 Jul 2005 14:23:17 -0000 >@@ -603,7 +603,7 @@ > > /** > * This method goes on the target type of the inter-type method. (and possibly the topmost-implemeters, >- * if the target type is an interface) >+- * if the target type is an interface). It calls the interMethodDispatcher on the aspect. > */ > public static ResolvedMember interMethod(ResolvedMember meth, TypeX aspectType, boolean onInterface) > { >@@ -621,6 +621,7 @@ > > /** > * This static method goes on the declaring aspect of the inter-type method. >+ * It calls the interMethodBody. > */ > public static ResolvedMember interMethodDispatcher(ResolvedMember meth, TypeX aspectType) > { >@@ -637,6 +638,7 @@ > > /** > * This static method goes on the declaring aspect of the inter-type method. >+ * It contains the body of the ITD method. > */ > public static ResolvedMember interMethodBody(ResolvedMember meth, TypeX aspectType) > { >Index: src/org/aspectj/weaver/NewConstructorTypeMunger.java >=================================================================== >RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/NewConstructorTypeMunger.java,v >retrieving revision 1.7 >diff -u -r1.7 NewConstructorTypeMunger.java >--- src/org/aspectj/weaver/NewConstructorTypeMunger.java 3 Aug 2004 12:35:10 -0000 1.7 >+++ src/org/aspectj/weaver/NewConstructorTypeMunger.java 6 Jul 2005 14:23:17 -0000 >@@ -38,8 +38,7 @@ > > } > >- //XXX horrible name clash here >- public ResolvedMember getDispatchMethod(TypeX aspectType) { >+ public ResolvedMember getInterMethodBody(TypeX aspectType) { > return AjcMemberMaker.interMethodBody(signature, aspectType); > } > >Index: src/org/aspectj/weaver/NewMethodTypeMunger.java >=================================================================== >RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/NewMethodTypeMunger.java,v >retrieving revision 1.5 >diff -u -r1.5 NewMethodTypeMunger.java >--- src/org/aspectj/weaver/NewMethodTypeMunger.java 3 Aug 2004 12:35:10 -0000 1.5 >+++ src/org/aspectj/weaver/NewMethodTypeMunger.java 6 Jul 2005 14:23:17 -0000 >@@ -28,10 +28,13 @@ > > } > >- //XXX horrible name clash here >- public ResolvedMember getDispatchMethod(TypeX aspectType) { >+ public ResolvedMember getInterMethodBody(TypeX aspectType) { > return AjcMemberMaker.interMethodBody(signature, aspectType); > } >+ >+ public ResolvedMember getInterMethodDispatcher(TypeX aspectType) { >+ return AjcMemberMaker.interMethodDispatcher(signature, aspectType); >+ } > > public void write(DataOutputStream s) throws IOException { > kind.write(s); >Index: src/org/aspectj/weaver/bcel/BcelClassWeaver.java >=================================================================== >RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java,v >retrieving revision 1.43 >diff -u -r1.43 BcelClassWeaver.java >--- src/org/aspectj/weaver/bcel/BcelClassWeaver.java 9 Jun 2005 15:57:26 -0000 1.43 >+++ src/org/aspectj/weaver/bcel/BcelClassWeaver.java 6 Jul 2005 14:23:18 -0000 >@@ -27,9 +27,11 @@ > > import org.aspectj.apache.bcel.Constants; > import org.aspectj.apache.bcel.classfile.Field; >+import org.aspectj.apache.bcel.classfile.annotation.Annotation; > import org.aspectj.apache.bcel.generic.BranchInstruction; > import org.aspectj.apache.bcel.generic.CPInstruction; > import org.aspectj.apache.bcel.generic.ConstantPoolGen; >+import org.aspectj.apache.bcel.generic.FieldGen; > import org.aspectj.apache.bcel.generic.FieldInstruction; > import org.aspectj.apache.bcel.generic.INVOKESPECIAL; > import org.aspectj.apache.bcel.generic.IndexedInstruction; >@@ -49,6 +51,7 @@ > import org.aspectj.apache.bcel.generic.ReturnInstruction; > import org.aspectj.apache.bcel.generic.Select; > import org.aspectj.apache.bcel.generic.Type; >+import org.aspectj.apache.bcel.generic.annotation.AnnotationGen; > import org.aspectj.bridge.IMessage; > import org.aspectj.bridge.ISourceLocation; > import org.aspectj.bridge.WeaveMessage; >@@ -78,6 +81,8 @@ > import org.aspectj.weaver.Shadow.Kind; > import org.aspectj.weaver.patterns.DeclareAnnotation; > import org.aspectj.weaver.patterns.FastMatchInfo; >+import org.aspectj.apache.bcel.classfile.Method; >+import org.aspectj.apache.bcel.generic.MethodGen; > > class BcelClassWeaver implements IClassWeaver { > >@@ -465,49 +470,58 @@ > for (int memberCounter = 0;memberCounter<members.size();memberCounter++) { > LazyMethodGen mg = (LazyMethodGen)members.get(memberCounter); > if (!mg.getName().startsWith(NameMangler.PREFIX)) { >- >- // Single first pass >- List worthRetrying = new ArrayList(); >- boolean modificationOccured = false; >- >- for (Iterator iter = decaMs.iterator(); iter.hasNext();) { >- DeclareAnnotation decaM = (DeclareAnnotation) iter.next(); >- >- if (decaM.matches(mg.getMemberView(),world)) { >- if (doesAlreadyHaveAnnotation(mg.getMemberView(),decaM,reportedProblems)) continue; // skip this one... >- mg.addAnnotation(decaM.getAnnotationX()); >- AsmRelationshipProvider.getDefault().addDeclareAnnotationRelationship(decaM.getSourceLocation(),clazz.getName(),mg.getMethod()); >- >- reportMethodCtorWeavingMessage(clazz, mg, decaM); >- isChanged = true; >- modificationOccured = true; >- } else { >- if (!decaM.isStarredAnnotationPattern()) >- worthRetrying.add(decaM); // an annotation is specified that might be put on by a subsequent decaf >- } >- } >- >- // Multiple secondary passes >- while (!worthRetrying.isEmpty() && modificationOccured) { >- modificationOccured = false; >- // lets have another go >- List forRemoval = new ArrayList(); >- for (Iterator iter = worthRetrying.iterator(); iter.hasNext();) { >- DeclareAnnotation decaM = (DeclareAnnotation) iter.next(); >- if (decaM.matches(mg.getMemberView(),world)) { >- if (doesAlreadyHaveAnnotation(mg.getMemberView(),decaM,reportedProblems)) continue; // skip this one... >- mg.addAnnotation(decaM.getAnnotationX()); >- AsmRelationshipProvider.getDefault().addDeclareAnnotationRelationship(decaM.getSourceLocation(),clazz.getName(),mg.getMethod()); >- isChanged = true; >- modificationOccured = true; >- forRemoval.add(decaM); >- } >- } >- worthRetrying.removeAll(forRemoval); >- } >+ >+ // Single first pass >+ List worthRetrying = new ArrayList(); >+ boolean modificationOccured = false; >+ >+ for (Iterator iter = decaMs.iterator(); iter.hasNext();) { >+ DeclareAnnotation decaM = (DeclareAnnotation) iter.next(); >+ >+ if (decaM.matches(mg.getMemberView(),world)) { >+ if (doesAlreadyHaveAnnotation(mg.getMemberView(),decaM,reportedProblems)) continue; // skip this one... >+ >+ Annotation a = decaM.getAnnotationX().getBcelAnnotation(); >+ AnnotationGen ag = new AnnotationGen(a,clazz.getConstantPoolGen(),true); >+ Method oldMethod = mg.getMethod(); >+ MethodGen myGen = new MethodGen(oldMethod,clazz.getClassName(),clazz.getConstantPoolGen()); >+ myGen.addAnnotation(ag); >+ Method newMethod = myGen.getMethod(); >+ mg.addAnnotation(decaM.getAnnotationX()); >+ members.set(memberCounter,new LazyMethodGen(newMethod,clazz)); >+ >+ AsmRelationshipProvider.getDefault().addDeclareAnnotationRelationship(decaM.getSourceLocation(),clazz.getName(),mg.getMethod()); >+ >+ reportMethodCtorWeavingMessage(clazz, mg, decaM); >+ isChanged = true; >+ modificationOccured = true; >+ } else { >+ if (!decaM.isStarredAnnotationPattern()) >+ worthRetrying.add(decaM); // an annotation is specified that might be put on by a subsequent decaf >+ } >+ } >+ >+ // Multiple secondary passes >+ while (!worthRetrying.isEmpty() && modificationOccured) { >+ modificationOccured = false; >+ // lets have another go >+ List forRemoval = new ArrayList(); >+ for (Iterator iter = worthRetrying.iterator(); iter.hasNext();) { >+ DeclareAnnotation decaM = (DeclareAnnotation) iter.next(); >+ if (decaM.matches(mg.getMemberView(),world)) { >+ if (doesAlreadyHaveAnnotation(mg.getMemberView(),decaM,reportedProblems)) continue; // skip this one... >+ mg.addAnnotation(decaM.getAnnotationX()); >+ AsmRelationshipProvider.getDefault().addDeclareAnnotationRelationship(decaM.getSourceLocation(),clazz.getName(),mg.getMethod()); >+ isChanged = true; >+ modificationOccured = true; >+ forRemoval.add(decaM); >+ } >+ } >+ worthRetrying.removeAll(forRemoval); >+ } > } > } >- } >+ } > return isChanged; > } > >@@ -581,8 +595,9 @@ > Collection c = clazz.getBcelObjectType().getTypeMungers(); > for (Iterator iter = c.iterator();iter.hasNext();) { > BcelTypeMunger typeMunger = (BcelTypeMunger)iter.next(); >- if (typeMunger.getMunger().getKind()==wantedKind) >+ if (typeMunger.getMunger().getKind()==wantedKind) { > subset.add(typeMunger); >+ } > } > return subset; > } >@@ -601,14 +616,45 @@ > // FIXME asc refactor this to neaten it up > public LazyMethodGen locateAnnotationHolderForMethodCtorMunger(LazyClassGen clazz,BcelTypeMunger methodCtorMunger) { > if (methodCtorMunger.getMunger() instanceof NewMethodTypeMunger) { >- NewMethodTypeMunger nftm = (NewMethodTypeMunger)methodCtorMunger.getMunger(); >- ResolvedMember lookingFor =AjcMemberMaker.interMethodBody(nftm.getSignature(),methodCtorMunger.getAspectType()); >- List meths = clazz.getMethodGens(); >- for (Iterator iter = meths.iterator(); iter.hasNext();) { >- LazyMethodGen element = (LazyMethodGen) iter.next(); >- if (element.getName().equals(lookingFor.getName()) && element.getParameterSignature().equals(lookingFor.getParameterSignature())) return element; >+ NewMethodTypeMunger nftm = (NewMethodTypeMunger)methodCtorMunger.getMunger(); >+ >+ ResolvedMember lookingFor =AjcMemberMaker.interMethodDispatcher(nftm.getSignature(),methodCtorMunger.getAspectType()); >+ >+ List meths = clazz.getMethodGens(); >+ for (Iterator iter = meths.iterator(); iter.hasNext();) { >+ LazyMethodGen element = (LazyMethodGen) iter.next(); >+ if (element.getName().equals(lookingFor.getName()) && element.getParameterSignature().equals(lookingFor.getParameterSignature())) return element; >+ } >+ return null; >+ } else if (methodCtorMunger.getMunger() instanceof NewConstructorTypeMunger) { >+ NewConstructorTypeMunger nftm = (NewConstructorTypeMunger)methodCtorMunger.getMunger(); >+ ResolvedMember lookingFor =AjcMemberMaker.postIntroducedConstructor(methodCtorMunger.getAspectType(),nftm.getSignature().getDeclaringType(),nftm.getSignature().getParameterTypes()); >+ List meths = clazz.getMethodGens(); >+ for (Iterator iter = meths.iterator(); iter.hasNext();) { >+ LazyMethodGen element = (LazyMethodGen) iter.next(); >+ if (element.getName().equals(lookingFor.getName()) && element.getParameterSignature().equals(lookingFor.getParameterSignature())) return element; >+ } >+ return null; >+ } else { >+ throw new RuntimeException("Not sure what this is: "+methodCtorMunger); > } >- return null; >+ } >+ >+ public LazyMethodGen locateOldAnnotationHolderForMethodCtorMunger(LazyClassGen clazz,BcelTypeMunger methodCtorMunger) { >+ // ajh02: stupid method added. >+ // this method is only needed because it's still looking on the old annotation holder >+ // (the interMethodBody) when doing pointcut matching for annotated methods. >+ if (methodCtorMunger.getMunger() instanceof NewMethodTypeMunger) { >+ NewMethodTypeMunger nftm = (NewMethodTypeMunger)methodCtorMunger.getMunger(); >+ >+ ResolvedMember lookingFor =AjcMemberMaker.interMethodBody(nftm.getSignature(),methodCtorMunger.getAspectType()); >+ >+ List meths = clazz.getMethodGens(); >+ for (Iterator iter = meths.iterator(); iter.hasNext();) { >+ LazyMethodGen element = (LazyMethodGen) iter.next(); >+ if (element.getName().equals(lookingFor.getName()) && element.getParameterSignature().equals(lookingFor.getParameterSignature())) return element; >+ } >+ return null; > } else if (methodCtorMunger.getMunger() instanceof NewConstructorTypeMunger) { > NewConstructorTypeMunger nftm = (NewConstructorTypeMunger)methodCtorMunger.getMunger(); > ResolvedMember lookingFor =AjcMemberMaker.postIntroducedConstructor(methodCtorMunger.getAspectType(),nftm.getSignature().getDeclaringType(),nftm.getSignature().getParameterTypes()); >@@ -694,9 +740,20 @@ > > if (decaMC.matches(itdIsActually,world)) { > LazyMethodGen annotationHolder = locateAnnotationHolderForMethodCtorMunger(clazz,methodctorMunger); >- if (doesAlreadyHaveAnnotation(annotationHolder,itdIsActually,decaMC,reportedErrors)) continue; // skip this one... >+ if (annotationHolder == null || doesAlreadyHaveAnnotation(annotationHolder,itdIsActually,decaMC,reportedErrors)) continue; // skip this one... >+ > annotationHolder.addAnnotation(decaMC.getAnnotationX()); >- itdIsActually.addAnnotation(decaMC.getAnnotationX()); >+ >+ // ajh02: this is kind of stupid. Because we still need the annotations on the >+ // interMethodBody for pointcut matching to work we have to put them there as >+ // well as on the interMethodDispatch. Really the code should be changed so >+ // that the pointcut matching code looks at the intermethod dispatch >+ // rather than the intermethodbody >+ LazyMethodGen oldAnnotationHolder = locateOldAnnotationHolderForMethodCtorMunger(clazz,methodctorMunger); >+ if (oldAnnotationHolder != null && !oldAnnotationHolder.hasAnnotation(decaMC.getAnnotationTypeX())){ >+ oldAnnotationHolder.addAnnotation(decaMC.getAnnotationX()); >+ } >+ > isChanged=true; > AsmRelationshipProvider.getDefault().addDeclareAnnotationRelationship(decaMC.getSourceLocation(),itdIsActually.getSourceLocation()); > modificationOccured = true; >@@ -728,6 +785,16 @@ > return isChanged; > } > >+ private boolean dontAddTwice(DeclareAnnotation decaF, Annotation [] dontAddMeTwice){ >+ for (int i = 0; i < dontAddMeTwice.length; i++){ >+ Annotation ann = dontAddMeTwice[i]; >+ if (ann != null && decaF.getAnnotationX().getTypeName().equals(ann.getTypeName())){ >+ dontAddMeTwice[i] = null; // incase it really has been added twice! >+ return true; >+ } >+ } >+ return false; >+ } > > /** > * Weave any declare @field statements into the fields of the supplied class >@@ -753,7 +820,6 @@ > List allDecafs = world.getDeclareAnnotationOnFields(); > if (allDecafs.isEmpty()) return false; // nothing to do > >- > boolean isChanged = false; > List itdFields = getITDSubset(clazz,ResolvedTypeMunger.Field); > if (itdFields!=null) { >@@ -771,16 +837,40 @@ > // Single first pass > List worthRetrying = new ArrayList(); > boolean modificationOccured = false; >+ >+ Annotation [] dontAddMeTwice = fields[fieldCounter].getAnnotations(); >+ > // go through all the declare @field statements > for (Iterator iter = decaFs.iterator(); iter.hasNext();) { > DeclareAnnotation decaF = (DeclareAnnotation) iter.next(); > if (decaF.matches(aBcelField,world)) { >- if (doesAlreadyHaveAnnotation(aBcelField,decaF,reportedProblems)) continue; // skip this one... >- aBcelField.addAnnotation(decaF.getAnnotationX()); >+ >+ if (!dontAddTwice(decaF,dontAddMeTwice)){ >+ if (doesAlreadyHaveAnnotation(aBcelField,decaF,reportedProblems)){ >+ continue; >+ } >+ if(decaF.getAnnotationTypeX().isAnnotationWithRuntimeRetention(world)){ >+ // it should be runtime visible, so put it on the Field >+ Annotation a = decaF.getAnnotationX().getBcelAnnotation(); >+ AnnotationGen ag = new AnnotationGen(a,clazz.getConstantPoolGen(),true); >+ FieldGen myGen = new FieldGen(fields[fieldCounter],clazz.getConstantPoolGen()); >+ myGen.addAnnotation(ag); >+ Field newField = myGen.getField(); >+ >+ aBcelField.addAnnotation(decaF.getAnnotationX()); >+ clazz.replaceField(fields[fieldCounter],newField); >+ fields[fieldCounter]=newField; >+ >+ } else{ >+ aBcelField.addAnnotation(decaF.getAnnotationX()); >+ } >+ } >+ > AsmRelationshipProvider.getDefault().addDeclareAnnotationRelationship(decaF.getSourceLocation(),clazz.getName(),fields[fieldCounter]); > reportFieldAnnotationWeavingMessage(clazz, fields, fieldCounter, decaF); > isChanged = true; > modificationOccured = true; >+ > } else { > if (!decaF.isStarredAnnotationPattern()) > worthRetrying.add(decaF); // an annotation is specified that might be put on by a subsequent decaf >@@ -795,6 +885,7 @@ > for (Iterator iter = worthRetrying.iterator(); iter.hasNext();) { > DeclareAnnotation decaF = (DeclareAnnotation) iter.next(); > if (decaF.matches(aBcelField,world)) { >+ // below code is for recursive things > if (doesAlreadyHaveAnnotation(aBcelField,decaF,reportedProblems)) continue; // skip this one... > aBcelField.addAnnotation(decaF.getAnnotationX()); > AsmRelationshipProvider.getDefault().addDeclareAnnotationRelationship(decaF.getSourceLocation(),clazz.getName(),fields[fieldCounter]); >@@ -848,7 +939,7 @@ > } > > private boolean doesAlreadyHaveAnnotation(LazyMethodGen rm,ResolvedMember itdfieldsig,DeclareAnnotation deca,List reportedProblems) { >- if (rm.hasAnnotation(deca.getAnnotationTypeX())) { >+ if (rm != null && rm.hasAnnotation(deca.getAnnotationTypeX())) { > if (world.getLint().elementAlreadyAnnotated.isEnabled()) { > Integer uniqueID = new Integer(rm.hashCode()*deca.hashCode()); > if (!reportedProblems.contains(uniqueID)) { >@@ -1263,6 +1354,7 @@ > // ---- > > private boolean match(LazyMethodGen mg) { >+ > BcelShadow enclosingShadow; > > List shadowAccumulator = new ArrayList(); >@@ -1287,7 +1379,7 @@ > // Annotations for things with effective signatures are never stored in the effective > // signature itself - we have to hunt for them. Storing them in the effective signature > // would mean keeping two sets up to date (no way!!) >- >+ > fixAnnotationsForResolvedMember(rm,mg.getMemberView()); > > enclosingShadow = >@@ -1594,7 +1686,7 @@ > ResolvedMember resolvedDooberry = world.resolve(declaredSig); > annotations = resolvedDooberry.getAnnotationTypes(); > } else { >- ResolvedMember realthing = AjcMemberMaker.interMethodBody(rm,memberHostType); >+ ResolvedMember realthing = AjcMemberMaker.interMethodDispatcher(rm,memberHostType); // > ResolvedMember resolvedDooberry = world.resolve(realthing); > annotations = resolvedDooberry.getAnnotationTypes(); > } >Index: src/org/aspectj/weaver/bcel/BcelTypeMunger.java >=================================================================== >RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java,v >retrieving revision 1.31 >diff -u -r1.31 BcelTypeMunger.java >--- src/org/aspectj/weaver/bcel/BcelTypeMunger.java 8 Jun 2005 14:21:48 -0000 1.31 >+++ src/org/aspectj/weaver/bcel/BcelTypeMunger.java 6 Jul 2005 14:23:20 -0000 >@@ -55,9 +55,9 @@ > import org.aspectj.weaver.TypeX; > import org.aspectj.weaver.WeaverMessages; > import org.aspectj.weaver.WeaverStateInfo; >+import org.aspectj.weaver.patterns.DeclareAnnotation; > import org.aspectj.weaver.patterns.Pointcut; > >- > //XXX addLazyMethodGen is probably bad everywhere > public class BcelTypeMunger extends ConcreteTypeMunger { > >@@ -707,8 +707,9 @@ > > private boolean mungeNewMethod(BcelClassWeaver weaver, NewMethodTypeMunger munger) { > ResolvedMember signature = munger.getSignature(); >- ResolvedMember dispatchMethod = munger.getDispatchMethod(aspectType); >- >+ ResolvedMember interMethodBody = munger.getInterMethodBody(aspectType); >+ ResolvedMember interMethodDispatcher = munger.getInterMethodDispatcher(aspectType); >+ > LazyClassGen gen = weaver.getLazyClassGen(); > > ResolvedTypeX onType = weaver.getWorld().resolve(signature.getDeclaringType(),munger.getSourceLocation()); >@@ -725,32 +726,48 @@ > } > > if (onType.equals(gen.getType())) { >- ResolvedMember introMethod = >+ ResolvedMember interMethod = > AjcMemberMaker.interMethod(signature, aspectType, onInterface); > >- AnnotationX annotationsOnRealMember[] = null; >+ >+ LazyMethodGen mg = makeMethodGen(gen, interMethod); >+ > // pr98901 > // For copying the annotations across, we have to discover the real member in the aspect > // which is holding them. >- if (weaver.getWorld().behaveInJava5Way && !onInterface && munger.getSignature().isPublic() && !munger.getSignature().isAbstract()) { >- ResolvedMember realMember = getRealMemberForITDFromAspect(aspectType,dispatchMethod); >- if (realMember==null) throw new BCException("Couldn't find ITD holder member '"+ >- dispatchMethod+"' on aspect "+aspectType); >- annotationsOnRealMember = realMember.getAnnotations(); >- } >- >- LazyMethodGen mg = makeMethodGen(gen, introMethod); >- >- if (annotationsOnRealMember!=null) { >- for (int i = 0; i < annotationsOnRealMember.length; i++) { >- AnnotationX annotationX = annotationsOnRealMember[i]; >- Annotation a = annotationX.getBcelAnnotation(); >- AnnotationGen ag = new AnnotationGen(a,weaver.getLazyClassGen().getConstantPoolGen(),true); >- mg.addAnnotation(new AnnotationX(ag.getAnnotation(),weaver.getWorld())); >+ if (weaver.getWorld().behaveInJava5Way){ >+ if (munger.getSignature().isPublic()){ >+ AnnotationX annotationsOnRealMember[] = null; >+ ResolvedMember realMember = getRealMemberForITDFromAspect(aspectType,interMethodDispatcher); >+ if (realMember==null) throw new BCException("Couldn't find ITD holder member '"+ >+ interMethodDispatcher+"' on aspect "+aspectType); >+ annotationsOnRealMember = realMember.getAnnotations(); >+ System.err.println("anns on " + realMember + ":"); >+ if (annotationsOnRealMember.length > 0) >+ System.err.println(annotationsOnRealMember[0].getTypeName()); >+ if (annotationsOnRealMember!=null) { >+ for (int i = 0; i < annotationsOnRealMember.length; i++) { >+ AnnotationX annotationX = annotationsOnRealMember[i]; >+ Annotation a = annotationX.getBcelAnnotation(); >+ AnnotationGen ag = new AnnotationGen(a,weaver.getLazyClassGen().getConstantPoolGen(),true); >+ mg.addAnnotation(new AnnotationX(ag.getAnnotation(),weaver.getWorld())); >+ } >+ } >+ } >+ // the below loop fixes the very special (and very stupid) >+ // case where an aspect declares an annotation >+ // on an ITD it declared on itself. >+ List allDecams = weaver.getWorld().getDeclareAnnotationOnMethods(); >+ for (Iterator i = allDecams.iterator(); i.hasNext();){ >+ DeclareAnnotation decaMC = (DeclareAnnotation) i.next(); >+ if (decaMC.matches(interMethod,weaver.getWorld()) >+ && mg.getEnclosingClass().getType() == aspectType) { >+ mg.addAnnotation(decaMC.getAnnotationX()); >+ } > } > } > >- if (!onInterface && !Modifier.isAbstract(introMethod.getModifiers())) { >+ if (!onInterface && !Modifier.isAbstract(interMethod.getModifiers())) { > InstructionList body = mg.getBody(); > InstructionFactory fact = gen.getFactory(); > int pos = 0; >@@ -759,22 +776,21 @@ > body.append(InstructionFactory.createThis()); > pos++; > } >- Type[] paramTypes = BcelWorld.makeBcelTypes(introMethod.getParameterTypes()); >+ Type[] paramTypes = BcelWorld.makeBcelTypes(interMethod.getParameterTypes()); > for (int i = 0, len = paramTypes.length; i < len; i++) { > Type paramType = paramTypes[i]; > body.append(InstructionFactory.createLoad(paramType, pos)); > pos+=paramType.getSize(); > } >- body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); >+ body.append(Utility.createInvoke(fact, weaver.getWorld(), interMethodBody)); > body.append( > InstructionFactory.createReturn( >- BcelWorld.makeBcelType(introMethod.getReturnType()))); >+ BcelWorld.makeBcelType(interMethod.getReturnType()))); > } else { > //??? this is okay > //if (!(mg.getBody() == null)) throw new RuntimeException("bas"); > } > >- > // XXX make sure to check that we set exceptions properly on this guy. > weaver.addLazyMethodGen(mg); > weaver.getLazyClassGen().warnOnAddedMethod(mg.getMethod(),getSignature().getSourceLocation()); >@@ -824,7 +840,7 @@ > body.append(InstructionFactory.createLoad(paramType, pos)); > pos+=paramType.getSize(); > } >- body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); >+ body.append(Utility.createInvoke(fact, weaver.getWorld(), interMethodBody)); > body.append(InstructionFactory.createReturn(returnType)); > mg.definingType = onType; > >@@ -1055,6 +1071,21 @@ > return false; > } > >+ >+ ResolvedMember interMethodBody = munger.getInitMethod(aspectType); >+ >+ AnnotationX annotationsOnRealMember[] = null; >+ // pr98901 >+ // For copying the annotations across, we have to discover the real member in the aspect >+ // which is holding them. >+ if (weaver.getWorld().behaveInJava5Way && munger.getSignature().isPublic()){ >+ // the below line just gets the method with the same name in aspectType.getDeclaredMethods(); >+ ResolvedMember realMember = getRealMemberForITDFromAspect(aspectType,interMethodBody); >+ if (realMember==null) throw new BCException("Couldn't find ITD init member '"+ >+ interMethodBody+"' on aspect "+aspectType); >+ annotationsOnRealMember = realMember.getAnnotations(); >+ } >+ > if (onType.equals(gen.getType())) { > if (onInterface) { > LazyMethodGen mg = makeMethodGen(gen, >@@ -1068,7 +1099,18 @@ > weaver.addInitializer(this); > FieldGen fg = makeFieldGen(gen, > AjcMemberMaker.interFieldClassField(field, aspectType)); >- gen.addField(fg.getField(),getSourceLocation()); >+ >+ if (annotationsOnRealMember!=null) { >+ for (int i = 0; i < annotationsOnRealMember.length; i++) { >+ AnnotationX annotationX = annotationsOnRealMember[i]; >+ Annotation a = annotationX.getBcelAnnotation(); >+ AnnotationGen ag = new AnnotationGen(a,weaver.getLazyClassGen().getConstantPoolGen(),true); >+ fg.addAnnotation(ag); >+ } >+ } >+ >+ gen.addField(fg.getField(),getSourceLocation()); >+ > } > return true; > } else if (onInterface && gen.getType().isTopmostImplementor(onType)) { >Index: src/org/aspectj/weaver/bcel/LazyClassGen.java >=================================================================== >RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java,v >retrieving revision 1.30 >diff -u -r1.30 LazyClassGen.java >--- src/org/aspectj/weaver/bcel/LazyClassGen.java 17 May 2005 08:29:18 -0000 1.30 >+++ src/org/aspectj/weaver/bcel/LazyClassGen.java 6 Jul 2005 14:23:20 -0000 >@@ -886,6 +886,11 @@ > myGen.addField(field); > } > >+ public void replaceField(Field oldF, Field newF){ >+ myGen.removeField(oldF); >+ myGen.addField(newF); >+ } >+ > public void addField(Field field, ISourceLocation sourceLocation) { > addField(field); > if (!(field.isPrivate()
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 98901
:
22786
|
23871
|
24121
|
24382
|
25399
|
25739
|
36976