Lines 57-63
Link Here
|
57 |
import org.aspectj.weaver.WeaverStateInfo; |
57 |
import org.aspectj.weaver.WeaverStateInfo; |
58 |
import org.aspectj.weaver.patterns.Pointcut; |
58 |
import org.aspectj.weaver.patterns.Pointcut; |
59 |
|
59 |
|
60 |
|
|
|
61 |
//XXX addLazyMethodGen is probably bad everywhere |
60 |
//XXX addLazyMethodGen is probably bad everywhere |
62 |
public class BcelTypeMunger extends ConcreteTypeMunger { |
61 |
public class BcelTypeMunger extends ConcreteTypeMunger { |
63 |
|
62 |
|
Lines 707-713
Link Here
|
707 |
|
706 |
|
708 |
private boolean mungeNewMethod(BcelClassWeaver weaver, NewMethodTypeMunger munger) { |
707 |
private boolean mungeNewMethod(BcelClassWeaver weaver, NewMethodTypeMunger munger) { |
709 |
ResolvedMember signature = munger.getSignature(); |
708 |
ResolvedMember signature = munger.getSignature(); |
710 |
ResolvedMember dispatchMethod = munger.getDispatchMethod(aspectType); |
709 |
ResolvedMember interMethodBody = munger.getInterMethodBody(aspectType); |
711 |
|
710 |
|
712 |
LazyClassGen gen = weaver.getLazyClassGen(); |
711 |
LazyClassGen gen = weaver.getLazyClassGen(); |
713 |
|
712 |
|
Lines 725-745
Link Here
|
725 |
} |
724 |
} |
726 |
|
725 |
|
727 |
if (onType.equals(gen.getType())) { |
726 |
if (onType.equals(gen.getType())) { |
728 |
ResolvedMember introMethod = |
727 |
ResolvedMember interMethod = |
729 |
AjcMemberMaker.interMethod(signature, aspectType, onInterface); |
728 |
AjcMemberMaker.interMethod(signature, aspectType, onInterface); |
730 |
|
729 |
|
731 |
AnnotationX annotationsOnRealMember[] = null; |
730 |
AnnotationX annotationsOnRealMember[] = null; |
732 |
// pr98901 |
731 |
// pr98901 |
733 |
// For copying the annotations across, we have to discover the real member in the aspect |
732 |
// For copying the annotations across, we have to discover the real member in the aspect |
734 |
// which is holding them. |
733 |
// which is holding them. |
735 |
if (weaver.getWorld().behaveInJava5Way && !onInterface && munger.getSignature().isPublic() && !munger.getSignature().isAbstract()) { |
734 |
if (weaver.getWorld().behaveInJava5Way && munger.getSignature().isPublic() |
736 |
ResolvedMember realMember = getRealMemberForITDFromAspect(aspectType,dispatchMethod); |
735 |
){ |
737 |
if (realMember==null) throw new BCException("Couldn't find ITD holder member '"+ |
736 |
// the below line just gets the method with the same name in aspectType.getDeclaredMethods(); |
738 |
dispatchMethod+"' on aspect "+aspectType); |
737 |
ResolvedMember realMember = getRealMemberForITDFromAspect(aspectType,interMethodBody); |
739 |
annotationsOnRealMember = realMember.getAnnotations(); |
738 |
if (realMember==null) throw new BCException("Couldn't find ITD holder member '"+ |
|
|
739 |
interMethodBody+"' on aspect "+aspectType); |
740 |
annotationsOnRealMember = realMember.getAnnotations(); |
741 |
if (annotationsOnRealMember.length > 0) |
742 |
System.err.println(annotationsOnRealMember[0].getTypeName()); |
743 |
|
740 |
} |
744 |
} |
741 |
|
745 |
|
742 |
LazyMethodGen mg = makeMethodGen(gen, introMethod); |
746 |
LazyMethodGen mg = makeMethodGen(gen, interMethod); |
743 |
|
747 |
|
744 |
if (annotationsOnRealMember!=null) { |
748 |
if (annotationsOnRealMember!=null) { |
745 |
for (int i = 0; i < annotationsOnRealMember.length; i++) { |
749 |
for (int i = 0; i < annotationsOnRealMember.length; i++) { |
Lines 750-756
Link Here
|
750 |
} |
754 |
} |
751 |
} |
755 |
} |
752 |
|
756 |
|
753 |
if (!onInterface && !Modifier.isAbstract(introMethod.getModifiers())) { |
757 |
if (!onInterface && !Modifier.isAbstract(interMethod.getModifiers())) { |
754 |
InstructionList body = mg.getBody(); |
758 |
InstructionList body = mg.getBody(); |
755 |
InstructionFactory fact = gen.getFactory(); |
759 |
InstructionFactory fact = gen.getFactory(); |
756 |
int pos = 0; |
760 |
int pos = 0; |
Lines 759-774
Link Here
|
759 |
body.append(InstructionFactory.createThis()); |
763 |
body.append(InstructionFactory.createThis()); |
760 |
pos++; |
764 |
pos++; |
761 |
} |
765 |
} |
762 |
Type[] paramTypes = BcelWorld.makeBcelTypes(introMethod.getParameterTypes()); |
766 |
Type[] paramTypes = BcelWorld.makeBcelTypes(interMethod.getParameterTypes()); |
763 |
for (int i = 0, len = paramTypes.length; i < len; i++) { |
767 |
for (int i = 0, len = paramTypes.length; i < len; i++) { |
764 |
Type paramType = paramTypes[i]; |
768 |
Type paramType = paramTypes[i]; |
765 |
body.append(InstructionFactory.createLoad(paramType, pos)); |
769 |
body.append(InstructionFactory.createLoad(paramType, pos)); |
766 |
pos+=paramType.getSize(); |
770 |
pos+=paramType.getSize(); |
767 |
} |
771 |
} |
768 |
body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); |
772 |
body.append(Utility.createInvoke(fact, weaver.getWorld(), interMethodBody)); |
769 |
body.append( |
773 |
body.append( |
770 |
InstructionFactory.createReturn( |
774 |
InstructionFactory.createReturn( |
771 |
BcelWorld.makeBcelType(introMethod.getReturnType()))); |
775 |
BcelWorld.makeBcelType(interMethod.getReturnType()))); |
772 |
} else { |
776 |
} else { |
773 |
//??? this is okay |
777 |
//??? this is okay |
774 |
//if (!(mg.getBody() == null)) throw new RuntimeException("bas"); |
778 |
//if (!(mg.getBody() == null)) throw new RuntimeException("bas"); |
Lines 824-830
Link Here
|
824 |
body.append(InstructionFactory.createLoad(paramType, pos)); |
828 |
body.append(InstructionFactory.createLoad(paramType, pos)); |
825 |
pos+=paramType.getSize(); |
829 |
pos+=paramType.getSize(); |
826 |
} |
830 |
} |
827 |
body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); |
831 |
body.append(Utility.createInvoke(fact, weaver.getWorld(), interMethodBody)); |
828 |
body.append(InstructionFactory.createReturn(returnType)); |
832 |
body.append(InstructionFactory.createReturn(returnType)); |
829 |
mg.definingType = onType; |
833 |
mg.definingType = onType; |
830 |
|
834 |
|
Lines 1039-1046
Link Here
|
1039 |
/*ResolvedMember initMethod = */munger.getInitMethod(aspectType); |
1043 |
/*ResolvedMember initMethod = */munger.getInitMethod(aspectType); |
1040 |
|
1044 |
|
1041 |
LazyClassGen gen = weaver.getLazyClassGen(); |
1045 |
LazyClassGen gen = weaver.getLazyClassGen(); |
1042 |
ResolvedMember field = munger.getSignature(); |
1046 |
ResolvedMember field = munger.getSignature(); |
1043 |
|
|
|
1044 |
|
1047 |
|
1045 |
ResolvedTypeX onType = weaver.getWorld().resolve(field.getDeclaringType(),munger.getSourceLocation()); |
1048 |
ResolvedTypeX onType = weaver.getWorld().resolve(field.getDeclaringType(),munger.getSourceLocation()); |
1046 |
boolean onInterface = onType.isInterface(); |
1049 |
boolean onInterface = onType.isInterface(); |
Lines 1055-1060
Link Here
|
1055 |
return false; |
1058 |
return false; |
1056 |
} |
1059 |
} |
1057 |
|
1060 |
|
|
|
1061 |
|
1062 |
ResolvedMember interMethodBody = munger.getInitMethod(aspectType); // ajh02: rename |
1063 |
|
1064 |
AnnotationX annotationsOnRealMember[] = null; |
1065 |
// pr98901 |
1066 |
// For copying the annotations across, we have to discover the real member in the aspect |
1067 |
// which is holding them. |
1068 |
if (weaver.getWorld().behaveInJava5Way && munger.getSignature().isPublic()){ |
1069 |
// the below line just gets the method with the same name in aspectType.getDeclaredMethods(); |
1070 |
ResolvedMember realMember = getRealMemberForITDFromAspect(aspectType,interMethodBody); |
1071 |
if (realMember==null) throw new BCException("Couldn't find ITD init member '"+ |
1072 |
interMethodBody+"' on aspect "+aspectType); |
1073 |
annotationsOnRealMember = realMember.getAnnotations(); |
1074 |
// ajh02: could a fix for pr99191 go around here too? |
1075 |
} |
1076 |
|
1058 |
if (onType.equals(gen.getType())) { |
1077 |
if (onType.equals(gen.getType())) { |
1059 |
if (onInterface) { |
1078 |
if (onInterface) { |
1060 |
LazyMethodGen mg = makeMethodGen(gen, |
1079 |
LazyMethodGen mg = makeMethodGen(gen, |
Lines 1068-1074
Link Here
|
1068 |
weaver.addInitializer(this); |
1087 |
weaver.addInitializer(this); |
1069 |
FieldGen fg = makeFieldGen(gen, |
1088 |
FieldGen fg = makeFieldGen(gen, |
1070 |
AjcMemberMaker.interFieldClassField(field, aspectType)); |
1089 |
AjcMemberMaker.interFieldClassField(field, aspectType)); |
1071 |
gen.addField(fg.getField(),getSourceLocation()); |
1090 |
|
|
|
1091 |
if (annotationsOnRealMember!=null) { |
1092 |
for (int i = 0; i < annotationsOnRealMember.length; i++) { |
1093 |
AnnotationX annotationX = annotationsOnRealMember[i]; |
1094 |
Annotation a = annotationX.getBcelAnnotation(); |
1095 |
AnnotationGen ag = new AnnotationGen(a,weaver.getLazyClassGen().getConstantPoolGen(),true); |
1096 |
fg.addAnnotation(ag); |
1097 |
} |
1098 |
} |
1099 |
|
1100 |
gen.addField(fg.getField(),getSourceLocation()); |
1101 |
|
1072 |
} |
1102 |
} |
1073 |
return true; |
1103 |
return true; |
1074 |
} else if (onInterface && gen.getType().isTopmostImplementor(onType)) { |
1104 |
} else if (onInterface && gen.getType().isTopmostImplementor(onType)) { |