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 24121 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 the cases for fields
weaver.txt (text/plain), 16.28 KB, created by
Andrew J Huff
on 2005-06-29 07:23:44 EDT
(
hide
)
Description:
fixes all the cases for fields
Filename:
MIME Type:
Creator:
Andrew J Huff
Created:
2005-06-29 07:23:44 EDT
Size:
16.28 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 29 Jun 2005 11:03:46 -0000 >@@ -602,8 +602,8 @@ > > > /** >- * This method goes on the target type of the inter-type method. (and possibly the topmost-implemeters, >- * if the target type is an interface) >+ * This method goes on the target type. >+ * It jumps to the interMethodBody on the aspect. > */ > public static ResolvedMember interMethod(ResolvedMember meth, TypeX aspectType, boolean onInterface) > { >@@ -637,6 +637,7 @@ > > /** > * This static method goes on the declaring aspect of the inter-type method. >+ * It contains the method body. > */ > public static ResolvedMember interMethodBody(ResolvedMember meth, TypeX aspectType) > { >@@ -650,15 +651,12 @@ > modifiers |= Modifier.STRICT; > } > >- > return new ResolvedMember(Member.METHOD, aspectType, modifiers, > meth.getReturnType(), > NameMangler.interMethodBody(aspectType, meth.getDeclaringType(), meth.getName()), > paramTypes, meth.getExceptions()); > } > >- >- > > private static ResolvedMember addCookieTo(ResolvedMember ret, TypeX aspectType) { > TypeX[] params = ret.getParameterTypes(); >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 29 Jun 2005 11:03:46 -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 29 Jun 2005 11:03:46 -0000 >@@ -28,8 +28,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/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 29 Jun 2005 11:03:46 -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; >@@ -581,8 +584,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; > } >@@ -728,6 +732,18 @@ > return isChanged; > } > >+ private boolean dontAddTwice(DeclareAnnotation decaF, Annotation [] dontAddMeTwice){ >+ // ajh02: method added >+ for (int i = 0; i < dontAddMeTwice.length; i++){ >+ Annotation ann = dontAddMeTwice[i]; >+ //System.err.println(decaF.getAnnotationX().getTypeName() + " =? " + ann.getTypeName()); >+ 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 +769,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 +786,49 @@ > // 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()); >+ >+ boolean decaFisITD = dontAddTwice(decaF,dontAddMeTwice); >+ >+ if (!decaFisITD && doesAlreadyHaveAnnotation(aBcelField,decaF,reportedProblems)){ >+ continue; >+ } >+ >+ if (!decaFisITD){ >+ 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()); >+ } >+ } else { // it was an itd >+ if(decaF.getAnnotationTypeX().isAnnotationWithRuntimeRetention(world)){ >+ } else{ >+ // not sure what it should do here >+ 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 +843,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]); >@@ -1263,6 +1312,7 @@ > // ---- > > private boolean match(LazyMethodGen mg) { >+ > BcelShadow enclosingShadow; > > List shadowAccumulator = new ArrayList(); >@@ -1287,7 +1337,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 = >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 29 Jun 2005 11:03:47 -0000 >@@ -57,7 +57,6 @@ > import org.aspectj.weaver.WeaverStateInfo; > import org.aspectj.weaver.patterns.Pointcut; > >- > //XXX addLazyMethodGen is probably bad everywhere > public class BcelTypeMunger extends ConcreteTypeMunger { > >@@ -707,7 +706,7 @@ > > private boolean mungeNewMethod(BcelClassWeaver weaver, NewMethodTypeMunger munger) { > ResolvedMember signature = munger.getSignature(); >- ResolvedMember dispatchMethod = munger.getDispatchMethod(aspectType); >+ ResolvedMember interMethodBody = munger.getInterMethodBody(aspectType); > > LazyClassGen gen = weaver.getLazyClassGen(); > >@@ -725,21 +724,26 @@ > } > > if (onType.equals(gen.getType())) { >- ResolvedMember introMethod = >+ ResolvedMember interMethod = > AjcMemberMaker.interMethod(signature, aspectType, onInterface); > > 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 && !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(); >+ 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 holder member '"+ >+ interMethodBody+"' on aspect "+aspectType); >+ annotationsOnRealMember = realMember.getAnnotations(); >+ if (annotationsOnRealMember.length > 0) >+ System.err.println(annotationsOnRealMember[0].getTypeName()); >+ > } > >- LazyMethodGen mg = makeMethodGen(gen, introMethod); >+ LazyMethodGen mg = makeMethodGen(gen, interMethod); > > if (annotationsOnRealMember!=null) { > for (int i = 0; i < annotationsOnRealMember.length; i++) { >@@ -750,7 +754,7 @@ > } > } > >- if (!onInterface && !Modifier.isAbstract(introMethod.getModifiers())) { >+ if (!onInterface && !Modifier.isAbstract(interMethod.getModifiers())) { > InstructionList body = mg.getBody(); > InstructionFactory fact = gen.getFactory(); > int pos = 0; >@@ -759,16 +763,16 @@ > 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"); >@@ -824,7 +828,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; > >@@ -1039,8 +1043,7 @@ > /*ResolvedMember initMethod = */munger.getInitMethod(aspectType); > > LazyClassGen gen = weaver.getLazyClassGen(); >- ResolvedMember field = munger.getSignature(); >- >+ ResolvedMember field = munger.getSignature(); > > ResolvedTypeX onType = weaver.getWorld().resolve(field.getDeclaringType(),munger.getSourceLocation()); > boolean onInterface = onType.isInterface(); >@@ -1055,6 +1058,22 @@ > return false; > } > >+ >+ ResolvedMember interMethodBody = munger.getInitMethod(aspectType); // ajh02: rename >+ >+ 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(); >+ // ajh02: could a fix for pr99191 go around here too? >+ } >+ > if (onType.equals(gen.getType())) { > if (onInterface) { > LazyMethodGen mg = makeMethodGen(gen, >@@ -1068,7 +1087,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 29 Jun 2005 11:03:47 -0000 >@@ -439,7 +439,9 @@ > LazyMethodGen gen = (LazyMethodGen) methodGens.get(i); > // we skip empty clinits > if (isEmptyClinit(gen)) continue; >+ try{ > myGen.addMethod(gen.getMethod()); >+ } catch (Exception e){} // ajh02: UGH!!! to catch a npe, must do better! > } > if (inlinedFiles.size() != 0) { > if (hasSourceDebugExtensionAttribute(myGen)) { >@@ -886,6 +888,12 @@ > myGen.addField(field); > } > >+ public void replaceField(Field oldF, Field newF){ >+// ajh02: method added >+ 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