From efc1cc47398443b33fe90da11c4cf1d14dc9c108 Mon Sep 17 00:00:00 2001 From: jhugunin Date: Fri, 8 Aug 2003 00:26:22 +0000 Subject: [PATCH] fix for Bugzilla Bug 41175 binary aspect-declared methods conflict, lost their exception clauses larger fix to address more issues with aspect-declared methods in bytecode form also addressed declared exception issue more generally this fix should be more stable than a smaller hack that just fixed this specific bug report would have been. added a few tests to match increased scope. --- .../ast/InterTypeConstructorDeclaration.java | 4 +- .../ast/InterTypeMethodDeclaration.java | 4 +- .../compiler/lookup/AjLookupEnvironment.java | 56 ++++++-- .../compiler/lookup/EclipseFactory.java | 4 +- .../compiler/lookup/EclipseSourceType.java | 4 +- .../compiler/batch/BinaryFormsTestCase.java | 2 +- tests/ajcTests.xml | 38 ++++++ tests/ajcTestsFailing.xml | 30 ----- tests/bugs/DeclaredExceptions.java | 28 ++++ tests/bugs/interfaceLibrary/lib.jar | Bin 1310 -> 1410 bytes tests/bugs/interfaceLibrary/libClass.jar | Bin 1485 -> 1531 bytes tests/new/interfaceLibrary/aspectOnly.jar | Bin 1027 -> 1066 bytes .../aspectedInterfaceOnly.jar | Bin 312 -> 347 bytes .../aspectedInterfaceOnlyBinary.jar | Bin 312 -> 347 bytes tests/new/interfaceLibrary/interfaceOnly.jar | Bin 263 -> 263 bytes .../src/org/aspectj/weaver/AjAttribute.java | 8 +- .../org/aspectj/weaver/AjcMemberMaker.java | 31 ++--- .../weaver/CrosscuttingMembersSet.java | 4 + .../org/aspectj/weaver/ResolvedMember.java | 18 ++- .../aspectj/weaver/ResolvedTypeMunger.java | 16 ++- .../src/org/aspectj/weaver/ResolvedTypeX.java | 11 +- .../org/aspectj/weaver/WeaverStateInfo.java | 121 ++++++++++++++++++ .../org/aspectj/weaver/WeaverStateKind.java | 48 ------- weaver/src/org/aspectj/weaver/World.java | 1 - .../org/aspectj/weaver/bcel/BcelAdvice.java | 3 +- .../aspectj/weaver/bcel/BcelClassWeaver.java | 8 +- .../aspectj/weaver/bcel/BcelObjectType.java | 15 +-- .../aspectj/weaver/bcel/BcelTypeMunger.java | 23 +++- .../org/aspectj/weaver/bcel/LazyClassGen.java | 43 +++---- 29 files changed, 349 insertions(+), 171 deletions(-) create mode 100644 tests/bugs/DeclaredExceptions.java create mode 100644 weaver/src/org/aspectj/weaver/WeaverStateInfo.java delete mode 100644 weaver/src/org/aspectj/weaver/WeaverStateKind.java diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeConstructorDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeConstructorDeclaration.java index 9ddf959d8..a1c8c8e02 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeConstructorDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeConstructorDeclaration.java @@ -212,8 +212,8 @@ public class InterTypeConstructorDeclaration extends InterTypeDeclaration { ResolvedMember signature = new ResolvedMember(Member.CONSTRUCTOR, declaringTypeX, declaredModifiers, - ResolvedTypeX.VOID, "", bindingAsMember.getParameterTypes()); - signature.setCheckedExceptions(world.fromEclipse(binding.thrownExceptions)); + ResolvedTypeX.VOID, "", bindingAsMember.getParameterTypes(), + world.fromEclipse(binding.thrownExceptions)); ResolvedMember syntheticInterMember = AjcMemberMaker.interConstructor(declaringTypeX, signature, aspectType); diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeMethodDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeMethodDeclaration.java index 662a5bc3f..2039fd54c 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeMethodDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeMethodDeclaration.java @@ -86,8 +86,8 @@ public class InterTypeMethodDeclaration extends InterTypeDeclaration { binding = classScope.referenceContext.binding.resolveTypesFor(binding); ResolvedMember sig = new ResolvedMember(Member.METHOD, EclipseFactory.fromBinding(onTypeBinding), declaredModifiers, EclipseFactory.fromBinding(binding.returnType), new String(declaredSelector), - EclipseFactory.fromBindings(binding.parameters)); - sig.setCheckedExceptions(world.fromEclipse(binding.thrownExceptions)); + EclipseFactory.fromBindings(binding.parameters), + world.fromEclipse(binding.thrownExceptions)); NewMethodTypeMunger myMunger = new NewMethodTypeMunger(sig, null); setMunger(myMunger); diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java index 868499adc..daacbc4e5 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java @@ -43,6 +43,7 @@ public class AjLookupEnvironment extends LookupEnvironment { // private boolean builtInterTypesAndPerClauses = false; private List pendingTypesToWeave = new ArrayList(); + private Map dangerousInterfaces = new HashMap(); public AjLookupEnvironment( ITypeRequestor typeRequestor, @@ -151,16 +152,49 @@ public class AjLookupEnvironment extends LookupEnvironment { } } - - private void weaveInterTypeDeclarations(SourceTypeBinding sourceType, Collection typeMungers, Collection declareParents, boolean skipInners) { -// if (new String(sourceType.sourceName()).equals("Target")) { -// Thread.currentThread().dumpStack(); -// } -// -// System.out.println("weaving types: " + new String(sourceType.sourceName())); -// System.out.println(" mungers: " + typeMungers); ResolvedTypeX onType = factory.fromEclipse(sourceType); + WeaverStateInfo info = onType.getWeaverState(); + + if (info != null && !info.isOldStyle()) { + Collection mungers = + onType.getWeaverState().getTypeMungers(onType); + + //System.out.println("mungers: " + mungers); + for (Iterator i = mungers.iterator(); i.hasNext(); ) { + ConcreteTypeMunger m = (ConcreteTypeMunger)i.next(); + EclipseTypeMunger munger = factory.makeEclipseTypeMunger(m); + if (munger.munge(sourceType)) { + if (onType.isInterface() && + munger.getMunger().needsAccessToTopmostImplementor()) + { + if (!onType.getWorld().getCrosscuttingMembersSet().containsAspect(munger.getAspectType())) { + dangerousInterfaces.put(onType, + "implementors of " + onType + " must be woven by " + + munger.getAspectType()); + } + } + } + + } + + return; + } + + //System.out.println("dangerousInterfaces: " + dangerousInterfaces); + + for (Iterator i = dangerousInterfaces.entrySet().iterator(); i.hasNext();) { + Map.Entry entry = (Map.Entry) i.next(); + ResolvedTypeX interfaceType = (ResolvedTypeX)entry.getKey(); + if (onType.isTopmostImplementor(interfaceType)) { + factory.showMessage(IMessage.ERROR, + onType + ": " + entry.getValue(), + onType.getSourceLocation(), null); + } + } + + boolean needOldStyleWarning = (info != null && info.isOldStyle()); + onType.clearInterTypeMungers(); for (Iterator i = declareParents.iterator(); i.hasNext();) { @@ -170,6 +204,12 @@ public class AjLookupEnvironment extends LookupEnvironment { for (Iterator i = typeMungers.iterator(); i.hasNext();) { EclipseTypeMunger munger = (EclipseTypeMunger) i.next(); if (munger.matches(onType)) { + if (needOldStyleWarning) { + factory.showMessage(IMessage.WARNING, + "The class for " + onType + " should be recompiled with ajc-1.1.1 for best results", + onType.getSourceLocation(), null); + needOldStyleWarning = false; + } onType.addInterTypeMunger(munger); } } diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.java index 76de36409..e9f9f0402 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseFactory.java @@ -192,8 +192,8 @@ public class EclipseFactory { binding.modifiers, fromBinding(binding.returnType), new String(binding.selector), - fromBindings(binding.parameters)); - ret.setCheckedExceptions(fromBindings(binding.thrownExceptions)); + fromBindings(binding.parameters), + fromBindings(binding.thrownExceptions)); return ret; } diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java index e965ea031..60f317f1f 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java @@ -66,8 +66,8 @@ public class EclipseSourceType extends ResolvedTypeX.ConcreteName { return declaration instanceof AspectDeclaration; } - public boolean isWovenBy(ResolvedTypeX aspectType) { - return false; + public WeaverStateInfo getWeaverState() { + return null; } public ResolvedTypeX getSuperclass() { diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BinaryFormsTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BinaryFormsTestCase.java index c98a12a11..0382c9a1f 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BinaryFormsTestCase.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/BinaryFormsTestCase.java @@ -101,7 +101,7 @@ public class BinaryFormsTestCase extends CommandTestCase { args.add("testdata/src1/binary/client/Client1.java"); - CommandTestCase.runCompiler(args, new int[] {9, 11, 15, 17}); + CommandTestCase.runCompiler(args, new int[] {15, 17, 22}); args = new ArrayList(); args.add("-classpath"); diff --git a/tests/ajcTests.xml b/tests/ajcTests.xml index 2ae8559ae..1a73d9990 100644 --- a/tests/ajcTests.xml +++ b/tests/ajcTests.xml @@ -6549,6 +6549,7 @@ + @@ -6629,4 +6630,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/ajcTestsFailing.xml b/tests/ajcTestsFailing.xml index 8b5d79788..5439341a1 100644 --- a/tests/ajcTestsFailing.xml +++ b/tests/ajcTestsFailing.xml @@ -12,36 +12,6 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/bugs/DeclaredExceptions.java b/tests/bugs/DeclaredExceptions.java new file mode 100644 index 000000000..9baec0c15 --- /dev/null +++ b/tests/bugs/DeclaredExceptions.java @@ -0,0 +1,28 @@ +import java.lang.reflect.Method; +import java.io.*; +import org.aspectj.testing.Tester; + +public class DeclaredExceptions { + public static void main(String[] args) throws Exception { + Class c = C.class; + Method m = c.getDeclaredMethod("m", new Class[0]); + Tester.checkEqual(m.getExceptionTypes().length, 1); + Tester.checkEqual(m.getExceptionTypes()[0], IOException.class); + + c = I.class; + m = c.getDeclaredMethod("m", new Class[0]); + Tester.checkEqual(m.getExceptionTypes().length, 1); + Tester.checkEqual(m.getExceptionTypes()[0], IOException.class); + } +} + +interface I {} + +class C {} + +aspect A { + public void C.m() throws IOException { + } + + public void I.m() throws IOException { } +} \ No newline at end of file diff --git a/tests/bugs/interfaceLibrary/lib.jar b/tests/bugs/interfaceLibrary/lib.jar index 496514a291b9c6aa9c7fe28a3320c51b23697983..57acb6aadf3ea00c553f2ea596ae230ecf2bcfd5 100644 GIT binary patch delta 1270 zcmV@6aWYS2mtzn2aydXe_L-8M;JX5JMkrkgpeB)QqwxcNx_C* zxH*L;A(c`&4`hxZ*`&W@_LuRQ&r#P-FsX~Gma<6RxEE06J}=;lf(Ih__ zc~V$h$~S$LPvaAYnPT-Y2kA6!oXz4i7RVsp>j|&HaG@U>C9<+~WOt;Xl0zQne+Db)}i#=mO+new|)74=V^Kva|#!z z#%Mi<64K*T)MYwBl#A^q!wEXU;p$u%lCITGZO_wfp{1L{D8@2WmESO&Culi_Mkd_x zBc3%s^csC-a3zbYrW!MC9z+ORfBQdMB2(j&F=e*qhsqT{$f(BqwUvz53}=VvySvvD zTcOtyiVAj^{y1cQ$XXO|-6zi;>fy)#$#yl(HHk`c)w+apBsU3w;u%BeD}}UebVwSV zLG&bFAotYbj?sIJdf0svACP70&Ftv%K28|u2#(V`XD5LvOWwaZgOix1e;aC^MnC>% zP1%?x_4baT@0se5AJo8pp%x}0F>7=f6J`DYb2|q(y)$)YAD=Ei$LG&+ejmj*1Nw}r zB`go<8^erM$*B4>`10c`r65M>Vr*M#`6VtfL>~7WciRf<7jqe3k@&CeYLugd{hoY= zZ+G4y`Q!jsclL4ZO^mpXe;Wh%*_b)|43&2nO+HRMj>hJq9zf2~$UNf*7$L@$-|^j3 zJ28rz*1=o&p8Bnkk7bG_Up3L$U-3h^1RlY0Z#Z!|I}d#IE8Q!uaQcg!cN)6n`bs#Z zlA}eS1E(Ig0!RKMCKl%${TprB!`iYyEl=$lwLNNYslCTKy%Xf}9^X()2M8atz~FoX z00317002-+0|XQR2mlBG`hy3PvI8rBZI8if!axv)|4E{0ZKZrFb#OI6qyA)z;KT2rV`T`9ujr7>|H!c${53GcRIDwBhM;=MA- z(#zbk6=P`HTF#f(1!3s>=q8=cKE4XIwYsTe^rY1}-F2T4Ac9*I5pHk`!o6gX=$*WE zBo5F;EXtu=K4d4hcaJd%2;=P9tP@w$19={}sjd*YZ!6iYWB3P9O9u#t_2HM^0000% z0RR9{O928D02BZS00;p3g9k4OAG5&Vd;9;g{Y3002P&000^Q g000000000000000y#tfM100hG1rP?~1ONa40F2040{{R3 delta 1164 zcmV;71atd>3!VxMP)h>@6aWYS2mmd<1(6LVf7@=;N)%m_q|K#)meL!y5+H@NK*Ajk zDVMessVJonL7<`tG;t=$M8S^iaiRaj0~d)Ns01&F2hKko*fTbev_awlOJjRxuUUJ| z+S~s6|A&u=;w+XK_LOAR_y#Yux!owNRa<5?$}q)SR<LDpIB<8KQw57Vq5Y5d#WQZ*}HA3z+B#x(+OgN1c5-CJ5q)DVL z?)%TG!hOK2Z32&$9E-Ofa#!kkxHvd(c+(ixJ7X9jZq<|?!xhafZ6(}Qp_)!D+aoI5 zmer@>%8CZnxh1l$Z!;Xol_*%)87ykuf2rjcmgp$y*py+vF-AItm9?MCaZE7GIBp}) zO`cZ%x!@bZ%`eyMG?g2oEE_ggzDwdKemPrKE*ZJ#6UvR_07Irn?%A5ClOMGVDa_4g z>W-U9;1I)juC$YbbZR$_q;L?^WDxIkgk57e(+v#@S)ARqJ5W$eBZFg_;W!mfe>p*n zVJx?M2Vt|A(b$tIOzMB%1obFkZ{Q%&t9nh$A4rVWyKYVigCAb4#!At3;^ZRhR|Ca2{Y)BG&_voiv5f9 zYlGWE_d$BX>>K`xEYMT04$N&~pN2-Tm+on^2#gx??#)T;#~A&grf7EWf44nla_Z8X ze+<2km->958uo;S9}UDT(qVL#sclTIZ{y(l=;19KoqLB9?{I1hxlcX%w5nOm_2?VK zxKYWd`;$0LN+W+)DJ9WLXF}WJbMJAEA@I1{xI0Ez66bM&BwRFWL1m)medG-;uYW=8 z)i$oKZ{gaf5b+PL_uwZ&f4f1nCstj4|0-b`Wo6sgc#@F;>K&UFo2uJ zw_CVP&(+A^vcixr=r_6Ycw`#e5UaqmUJ}o9Z*XL2+4_)(qsbw04WCm08mQ<1QY-W1^@^EF1`hm$^$EZ zU5mjAf>0Dh=c;MBYEj#uT`hY4MGyongj!$aCW>g>o<_gcq7Ue!qNmGdab_4epYQ7p zA3MZ^MO|jevCNe9d1$QYm2-(egn7k1Cp9-ka>^>nZ3LeXr){UX?8{mR%YV@f4q?@5 zVfcP?Qe_^(y{Ng2m0Gq=^tEdoH`{YOxQ2%SLnt6jF>}kqWMqhF_`M%cO9u!Fl(-9$ z000270000`O928D02BZS00;mrz6CGIiIdV~0{{Rill%lUA1=NHFA9{n3z7f;0I>i7 e02%-Q00000000000001`lTQUL27d$q0000BQW>BC diff --git a/tests/bugs/interfaceLibrary/libClass.jar b/tests/bugs/interfaceLibrary/libClass.jar index 720435d6292bdf0467afd689b1091f995f59835f..ee68ce1c092822224466b66dd7352782e1b97de7 100644 GIT binary patch delta 1385 zcmV-v1(y2F3;PQVP)h>@6aWYS2mo4!2aydce_KxzK^Q$l3x!&xqFlUT)uIKZ^^RIV zpkhK&<)K7_X+oykX}h)VHnUR{U;R5icuBxWqHjL<<{whOncZNaHSxhsX6JV1d}q)1 z?R@|F`3pjr#xlcD-Y!Wlw{i{cd5d0CSSkX>5U=x1o@sEWnprK?&1#5YjMuGXQ^S^($@1}v2WJ!#xST)h7l)jRkJ;Y8O?1wO2|h-)!cHj zQ(3ZMmp0m$ld|P745#w6k!jz^YSGc_H+DtNl0=#Yv2lMZDP*PMP6KJJio-cCzENFC!a60_QZtc}kyh{XI%>f2#8Y zVUw89*o#q&>W~B4d!2?2owg1$85RyC=Yj1txw2~4{yj_agR~J`q4J`=7}B~Jrja4( zekN8cWH?FhTAkxvGPYPRY&ohXlx@Y(i@pJ>%9{+A2$~6?z6Fn6pJ&N!IpwxWxE;le zuEv2H4Rcm({B{N1DR`D4uqOMiKOzMqf&^)9|10C&b>B1VL*~6}7W#Z`qe=wH}jfeAH zeo_tFptc$Eg)GsB=m=xG7+v4R$@QVrJ2*SFjSJhjw1d>wecH652bkKYtq;RSA*GKP zFaKYa6hN!IuxHmcuKLcl+vQ7YmvIf(N%jr1>t`lp#_d5R@@K6SUH{jO2Vo<=vm#%zH7m6i{?PbmDWtFyEDT?WIQ3+3Z#Zs&470o?VA#@@6aWYS z2mo4!2a~S@Cx2~GOH0E*5S~raMq{;apCAZ5w1UaeLq(9HAVhnp)MMGCOWhEYve{Ps zSv@Hp`~m(bads`G*e>kM&NtsY_xtDb3rskJBLbzE2cFLZLB(4qrdehKK{TRM>cun} zdEFplp|rsykiXywmzM<0W~)!Y>ZC(ffE?rhc>43vI=>RD^I$aTVQ3oc1HGg&7wz2k0FywDO{pt9w`)kHjv;p3! zD*X#kO9u#vIvjvw0RRAB0ssI|O928D02BZS01pTNT80NNQ1fb6ZUX=STa!iwIUibv r2QP^_9Drj1003VC000&M000000000000000w3D6%DF#~w000002TzDg delta 1357 zcmV-T1+x143(X4+P)h>@6aWYS2mmj>1(6Lae_c-#K@>gH7D`Knit?#q)v5)h6~9mm z3RFx;3Ov+kFipsGJ8ieAyUp$t#oxq(XaYtOee=OL|B!lTc7ui1#0NK-ot=B{oO|Zn zyYv0$=Pw9i1}h9hd9&njXD8R-uDj$mg(1UW4DmYO=9vb!s+o;aU0Z_;W4vx8o5CrW ze^#|2q;0KQuH=>>7|!N9k+KYZ^G3t8O!=50n3{UQ5X#wQ3Lnr&wkvbm9YYj-Q3TM> zFqk(jvEF)J63%m8Y6wNrHhAL&cTBbRjlJ_4H-+oO?Zc=-ZFNU;gh8bjt zx>t#f3JFfsyLRVfmx?Xb3p!;R>hZV_87)|^c>cq_YW@KR3&$t5uhai@9wcrp#cogJEo1mkOptx9Kji!r3-6}R?oV&mCmOce?VU{^gW#K z@{_8tEgIWFkH|6|L}eH|#OUTBCN_u8AK>EjKCbNJ`T<~9%T;Hw|; z5RZ<l1{hc>JSx6%i+<-8rEsNNEVZg`QQs~VZU{ed@h`uY?qTS2Ptr)xSfKHa z#&;S&kW=2kZ%|7I2yVx&He3S$051ms08mQ<1QY-W00;mtz6CD;lfwfge`Qe1O2a@D zJ=3I(#%f>ICkR3otzfcrp$JkGglZR+x|B&e)Cn;uleFq*b)~rQ1NO--Y{;kFi+DWpdVVN^%!0vCx{$HVE*Xqg zd%$3JlA$Q0h>{HxYYdgHe~iWbOL*gj+(>_&DLte_MnU^YWXlL zWh^voY@^O_l&F!*H5t0Ef=`8VA2swdp3$I&ZqU$6lZkiRyM7DAe>js#Y+;W+wQy4$ zqd?2bPXR379a)P!kB|`-Pd>0d)8P%WWliR|N!F%Y(u_%Vm)-@PTw5f6qB+wE2XoOr zNw##k3U&xt;SW$t2MAIho1I4i00900002-+0Rj{N6aWYS2mmj>1ut&Lt~Oi)001us z000;O0000000000lYs>+ATPcJFH#?yoksxx0R90002TlM00000000000001@1C!7L P7?b4%5C$y;00000CoW$6 diff --git a/tests/new/interfaceLibrary/aspectOnly.jar b/tests/new/interfaceLibrary/aspectOnly.jar index 4aaffb64563fc62d26bef09ab3f7e98f59976eb9..eb6505b8c37f6e66b605e02430b2158d862e5122 100644 GIT binary patch delta 994 zcmV<810DQ>2&xDTP)h>@6aWYS2mqyq2aydXe_d}IMHD>~J6YS=wrQFs4K&3ChdQCP zTM7Z1kdU}3q_`iFt5yL^)p$L&$2hyz>^NzD1#kR{K9C?aKqPqU13wD5GrLH3VkA&k znw_1wcg{Wc+&lZnpTGWw1a6?raHcG4imUzguq!<6fH6$8`7SSZxZf;3sFdxGIyc>rXYA+_Rlq%ZXg0LWf&`&1S+k1_ zQW=b3+<-`5JnZe%gnGhj9de#52OjS{xF>R|=QGUaf6HVno-{5S-t&QK7Pv)d7xo0-6{@h=XwXvb zii&LdT=$e1(5$i_YO&*BnsOIPFG`o z`^u1}SZ`PMeccjTdM-vWmZq*If7ff|T8v#Iu^t8y&PLGl>zgk;(bY2W9ekd_s_Eu* zi-(biy*uAnAah41V#rJ-=qXR!lhGaN=TFwH0VA6v3A5P-}rf9xMtK0wDQ#Ph4z5Pd7s5Kg;L=<(C z*c-T+L%e;Ax$Vh!j_~f{E4=>-^eztaaB04YTQQG}O(2PBN<57Z-+&7dFkI$i1)RlS z@CidCSHA{d+t_J*iq9z4e;vCQiJY+C6NgyYevRah$5`Dy!rJe##}`;1@Sl$HGKbiB zjnU-G#LH-H{?r4WGd4$H{1_vISo#Tf5A4P$DQBd)hc9Vf8u{Nj+pn)o81`5EV2hSL zeCyq*#*J6q3)FY?2k=C-za4qIt_xnEM72<;Y7y$N>WjUq{3mEkL85y4+F0hW>Ce(I z+`p&s1Mbs1K`QP)h>@6aWYS2mr;D1(6LVe_?MEM-Y7*+d11gAcT;RLTI2)aZ+lR z(xz=3k|rk5v<51fQl+wl)|ZXFmUCzAtrMdDB|eZ;A}x{HZ+zfK(a!E&B|9+^RZrU6 z+nKj--puUYo42q2L;|0p!f>V{>x!%W)vzNx?SL_iw)ieDwz=OZKB~8@HNkL+x4c|O zf2gYT8*QNjf5Q(o_dUUIuF^+RVn{D}ZRtzB%#g^>Jz+?egDpaywIo5P%hv58i*y!4 z7%?Q$7Z1BTb)g>fdYiywmB8ceCtOLhj*Y`hme<8OvoncN;?_+WGAtNw>1&}L2;B^} za($w5ZCQUBTQ&@6n|mUsx<12HzCzC8e@SP_=$;K!qrfdgtFR~du26;b?QL4hT~U<{ zpX;s?eKo7@hg$47n4sK+QVbU>)+vMHkBanFwGw=%JU5t`bqcauP@)O(|xwn8r1#4)1h?zr}E~7aDc3G<#1%c8=k~fV>=h!r*j_q3yeL#z@*t6c{q5J*HDnDc`{bXIMGW!@Dx< zaP2j3y>~Om2QfRiP0b*`i!YHL!53JdOry3w+GaRUnVvktR|j-{wN>5sbyH~RxkzC+ zLr0gOHwapcp;56O1`*F%(Dk?0f1i1xqh;VbxRb@QIkK514k%4{|0 zDo@;#(M9OhRxnj(m>!_-@qR}<==u#or*3MH{y5~!0ACca98k@k>A~s$Y^SQ`nnWeJ zYJ7%kBsU3w;+cZbmxHt&lq9XLAbOI&!#%LLGxQ#&8MG7T7RSgU&BmIVe?P+c1M5CZ zZ`T@uF-zXNIfDxrr}-kSZol(P*_fvF_D5u?R%nzHQPg!(Z|Eiuarqe2n`0jy;rjeb zeEbshF81qiY5oDXVjWqVKoS#_cm|*U4=p6XXqk;G;LQJluNb0o_0}MYox#`mhGH#R zTU6wP{T@BU(&lR-$^*wuj%Z-AZ8YHsJjKS8j_+@qrJ# ul}pPnxA6yfvvV{Yuj<^&z`*behy%PCnM4@i9@B@*P5f-n_7|vtfdK&jI%pLD delta 221 zcmcc3w1bH^z?+#xgnsYm4|_EMBzybXsAWgvI>#uX*LIkF>bPrk&h)X3E#fj5RN&7I!+dR35ce zH#K)HI;C|omu0@d^4#S+-<*!(I9-2{hcEGJR^pGk;-FNyLwi^3?3o(1&F{B#u8S3ba-or7!24(>?|3=A8AIKZ2cNrVCJYJIreWHCm2 Kwp&0I3=9BWq*j3d diff --git a/tests/new/interfaceLibrary/aspectedInterfaceOnlyBinary.jar b/tests/new/interfaceLibrary/aspectedInterfaceOnlyBinary.jar index 9cb969b9d12def7ce24052733e4e9edbf36242ae..fe334d0764b5e00e6d3c20647ac48124e70ac8a9 100644 GIT binary patch delta 255 zcmdnNbeoAcz?+#xgn-$^*wuj%Z-AZ8YHsJjKS8j_+@qrJ# ul}pPnxA6yfvvV{Yuj<^&z`*behy%PCnM4@i9@B@*P5f-n_7|vtfdK#%+-N@l delta 221 zcmcc3w1bH^z?+#xgnsYm4|_EMBzybXsAWgvI>#uX*LIkF>bPrk&h)X3E#fj5RN&7I!+dR35ce zH#K)HI;C|omu0@d^4#S+-<*!(I9-2{hcEGJR^pGk;-FNyLwi^3?3o(1&F{B#u8S3ba-or7!24(>?|3=A8AIKZ2cNrVCJYJIreWHCm2 Kwp&0I3=9BWq*j3d diff --git a/tests/new/interfaceLibrary/interfaceOnly.jar b/tests/new/interfaceLibrary/interfaceOnly.jar index ede6fc868f7ffd886fbaa2fdaa68ea49069690ba..15c0fa5599bd96757ea41f57b449a1496d7d008b 100644 GIT binary patch delta 28 fcmZo?YG>jN@MdNaVc-D5sy6nCyepVN)DC|DP$mY| delta 28 fcmZo?YG>jN@MdNaVc-D5!&6u%@~&V8Q9JwrR$&K! diff --git a/weaver/src/org/aspectj/weaver/AjAttribute.java b/weaver/src/org/aspectj/weaver/AjAttribute.java index f981d21b2..217f04280 100644 --- a/weaver/src/org/aspectj/weaver/AjAttribute.java +++ b/weaver/src/org/aspectj/weaver/AjAttribute.java @@ -88,7 +88,7 @@ public abstract class AjAttribute { if (name.equals(Aspect.AttributeName)) { return new Aspect(PerClause.readPerClause(s, context)); } else if (name.equals(WeaverState.AttributeName)) { - return new WeaverState(WeaverStateKind.read(s)); + return new WeaverState(WeaverStateInfo.read(s, context)); } else if (name.equals(AdviceAttribute.AttributeName)) { return AdviceAttribute.read(s, context); } else if (name.equals(PointcutDeclarationAttribute.AttributeName)) { @@ -162,15 +162,15 @@ public abstract class AjAttribute { public String getNameString() { return AttributeName; } - private WeaverStateKind kind; - public WeaverState(WeaverStateKind kind) { + private WeaverStateInfo kind; + public WeaverState(WeaverStateInfo kind) { this.kind = kind; } public void write(DataOutputStream s) throws IOException { kind.write(s); } - public WeaverStateKind reify() { + public WeaverStateInfo reify() { return kind; } } diff --git a/weaver/src/org/aspectj/weaver/AjcMemberMaker.java b/weaver/src/org/aspectj/weaver/AjcMemberMaker.java index ae29a0d4c..308b020b9 100644 --- a/weaver/src/org/aspectj/weaver/AjcMemberMaker.java +++ b/weaver/src/org/aspectj/weaver/AjcMemberMaker.java @@ -232,8 +232,8 @@ public class AjcMemberMaker { Modifier.PUBLIC, method.getReturnType(), NameMangler.superDispatchMethod(baseType, method.getName()), - method.getParameterTypes()); - //XXX needs thrown exceptions to be correct + method.getParameterTypes(), + method.getExceptions()); } public static ResolvedMember inlineAccessMethodForMethod(TypeX aspectType, ResolvedMember method) { @@ -249,8 +249,7 @@ public class AjcMemberMaker { NameMangler.inlineAccessMethodForMethod(method.getName(), method.getDeclaringType(), aspectType), - paramTypes); - //XXX needs thrown exceptions to be correct + paramTypes, method.getExceptions()); } public static ResolvedMember inlineAccessMethodForFieldGet(TypeX aspectType, Member field) { @@ -382,7 +381,8 @@ public class AjcMemberMaker { Modifier.PUBLIC, ResolvedTypeX.VOID, "", - constructor.getParameterTypes()); + constructor.getParameterTypes(), + constructor.getExceptions()); //System.out.println("ret: " + ret + " mods: " + Modifier.toString(modifiers)); if (Modifier.isPublic(constructor.getModifiers())) return ret; @@ -429,7 +429,8 @@ public class AjcMemberMaker { return new ResolvedMember(Member.METHOD, aspectType, PUBLIC_STATIC, field.getReturnType(), NameMangler.interFieldGetDispatcher(aspectType, field.getDeclaringType(), field.getName()), - field.isStatic() ? TypeX.NONE : new TypeX[] {field.getDeclaringType()} + field.isStatic() ? TypeX.NONE : new TypeX[] {field.getDeclaringType()}, + TypeX.NONE ); } @@ -451,7 +452,7 @@ public class AjcMemberMaker { makePublicNonFinal(field.getModifiers()), field.getReturnType(), NameMangler.interFieldClassField(field.getModifiers(), aspectType, field.getDeclaringType(), field.getName()), - TypeX.NONE + TypeX.NONE, TypeX.NONE ); } @@ -464,7 +465,7 @@ public class AjcMemberMaker { return new ResolvedMember(Member.FIELD, onClass, makePublicNonFinal(field.getModifiers()), field.getReturnType(), NameMangler.interFieldInterfaceField(aspectType, field.getDeclaringType(), field.getName()), - TypeX.NONE + TypeX.NONE, TypeX.NONE ); } @@ -478,7 +479,7 @@ public class AjcMemberMaker { return new ResolvedMember(Member.METHOD, onType, modifiers, ResolvedTypeX.VOID, NameMangler.interFieldInterfaceSetter(aspectType, field.getDeclaringType(), field.getName()), - new TypeX[] {field.getReturnType()} + new TypeX[] {field.getReturnType()}, TypeX.NONE ); } @@ -492,7 +493,7 @@ public class AjcMemberMaker { return new ResolvedMember(Member.METHOD, onType, modifiers, field.getReturnType(), NameMangler.interFieldInterfaceGetter(aspectType, field.getDeclaringType(), field.getName()), - TypeX.NONE + TypeX.NONE, TypeX.NONE ); } @@ -514,7 +515,7 @@ public class AjcMemberMaker { modifiers, meth.getReturnType(), NameMangler.interMethod(meth.getModifiers(), aspectType, meth.getDeclaringType(), meth.getName()), - meth.getParameterTypes()); + meth.getParameterTypes(), meth.getExceptions()); } /** @@ -530,7 +531,7 @@ public class AjcMemberMaker { return new ResolvedMember(Member.METHOD, aspectType, PUBLIC_STATIC, meth.getReturnType(), NameMangler.interMethodDispatcher(aspectType, meth.getDeclaringType(), meth.getName()), - paramTypes); + paramTypes, meth.getExceptions()); } /** @@ -552,7 +553,7 @@ public class AjcMemberMaker { return new ResolvedMember(Member.METHOD, aspectType, modifiers, meth.getReturnType(), NameMangler.interMethodBody(aspectType, meth.getDeclaringType(), meth.getName()), - paramTypes); + paramTypes, meth.getExceptions()); } @@ -568,7 +569,7 @@ public class AjcMemberMaker { ret.getModifiers(), ret.getReturnType(), ret.getName(), - freshParams); + freshParams, ret.getExceptions()); } public static ResolvedMember toObjectConversionMethod(TypeX fromType) { @@ -580,7 +581,7 @@ public class AjcMemberMaker { PUBLIC_STATIC, TypeX.OBJECT, name, - new TypeX[] { fromType }); + new TypeX[] { fromType }, TypeX.NONE); } else { return null; } diff --git a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java index 5b2e84131..ec81a0cf2 100644 --- a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java +++ b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java @@ -66,6 +66,10 @@ public class CrosscuttingMembersSet { return isAspect; } + public boolean containsAspect(TypeX aspectType) { + return members.containsKey(aspectType); + } + //XXX only for testing public void addFixedCrosscuttingMembers(ResolvedTypeX aspectType) { members.put(aspectType, aspectType.crosscuttingMembers); diff --git a/weaver/src/org/aspectj/weaver/ResolvedMember.java b/weaver/src/org/aspectj/weaver/ResolvedMember.java index 60164e167..d1a4e9633 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedMember.java +++ b/weaver/src/org/aspectj/weaver/ResolvedMember.java @@ -34,7 +34,19 @@ public class ResolvedMember extends Member implements IHasPosition { protected int start, end; protected ISourceContext sourceContext = null; - // ---- + //XXX deprecate this in favor of the constructor below + public ResolvedMember( + Kind kind, + TypeX declaringType, + int modifiers, + TypeX returnType, + String name, + TypeX[] parameterTypes) + { + super(kind, declaringType, modifiers, returnType, name, parameterTypes); + } + + public ResolvedMember( Kind kind, @@ -42,9 +54,11 @@ public class ResolvedMember extends Member implements IHasPosition { int modifiers, TypeX returnType, String name, - TypeX[] parameterTypes) + TypeX[] parameterTypes, + TypeX[] checkedExceptions) { super(kind, declaringType, modifiers, returnType, name, parameterTypes); + this.checkedExceptions = checkedExceptions; } public ResolvedMember( diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java b/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java index 086ade7b2..a732cf82c 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java @@ -54,7 +54,7 @@ public abstract class ResolvedTypeMunger { //System.err.println("matching: " + this + " to " + matchType + " onType = " + onType); if (matchType.equals(onType)) { if (!onType.isExposedToWeaver()) { - if (!onType.isWovenBy(aspectType)) { + if (onType.getWeaverState() != null) { if (matchType.getWorld().getLint().typeNotExposedToWeaver.isEnabled()) { matchType.getWorld().getLint().typeNotExposedToWeaver.signal( matchType.getName(), signature.getSourceLocation()); @@ -183,4 +183,18 @@ public abstract class ResolvedTypeMunger { return null; } + public boolean changesPublicSignature() { + return kind == Field || kind == Method || kind == Constructor; + } + + public boolean needsAccessToTopmostImplementor() { + if (kind == Field) { + return true; + } else if (kind == Method) { + return !signature.isAbstract(); + } else { + return false; + } + } + } diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java index a9b6fa654..1861254a5 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java +++ b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java @@ -575,8 +575,8 @@ public abstract class ResolvedTypeX extends TypeX { return delegate.isExposedToWeaver(); //??? where does this belong } - public boolean isWovenBy(ResolvedTypeX aspectType) { - return delegate.isWovenBy(aspectType); + public WeaverStateInfo getWeaverState() { + return delegate.getWeaverState(); } public ResolvedMember[] getDeclaredFields() { @@ -684,7 +684,7 @@ public abstract class ResolvedTypeX extends TypeX { // public abstract ISourceLocation getSourceLocation(); - public abstract boolean isWovenBy(ResolvedTypeX aspectType); + public abstract WeaverStateInfo getWeaverState(); // public ISourceContext getSourceContext() { // return sourceContext; @@ -1270,8 +1270,7 @@ public abstract class ResolvedTypeX extends TypeX { public ISourceLocation getSourceLocation() { return null; } public boolean isExposedToWeaver() { return false; } - public boolean isWovenBy(ResolvedTypeX aspectType) { - return false; + public WeaverStateInfo getWeaverState() { + return null; } - } diff --git a/weaver/src/org/aspectj/weaver/WeaverStateInfo.java b/weaver/src/org/aspectj/weaver/WeaverStateInfo.java new file mode 100644 index 000000000..20b5347c1 --- /dev/null +++ b/weaver/src/org/aspectj/weaver/WeaverStateInfo.java @@ -0,0 +1,121 @@ +/* ******************************************************************* + * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * PARC initial implementation + * ******************************************************************/ + + +package org.aspectj.weaver; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.aspectj.bridge.IMessage; +import org.aspectj.util.TypeSafeEnum; +import org.aspectj.weaver.bcel.BcelTypeMunger; + +public class WeaverStateInfo { + private List/*Entry*/ typeMungers; + private boolean oldStyle; + + public WeaverStateInfo() { + this(new ArrayList(), false); + } + + private WeaverStateInfo(List typeMungers, boolean oldStyle) { + this.typeMungers = typeMungers; + this.oldStyle = oldStyle; + } + + private static final int UNTOUCHED=0, WOVEN=2, EXTENDED=3; + + public static final WeaverStateInfo read(DataInputStream s, ISourceContext context) throws IOException { + byte b = s.readByte(); + + switch(b) { + case UNTOUCHED: + throw new RuntimeException("unexpected UNWOVEN"); + case WOVEN: + return new WeaverStateInfo(Collections.EMPTY_LIST, true); + case EXTENDED: + int n = s.readShort(); + List l = new ArrayList(); + for (int i=0; i < n; i++) { + TypeX aspectType = TypeX.read(s); + ResolvedTypeMunger typeMunger = + ResolvedTypeMunger.read(s, context); + l.add(new Entry(aspectType, typeMunger)); + } + return new WeaverStateInfo(l, false); + } + throw new RuntimeException("bad WeaverState.Kind: " + b); + } + + private static class Entry { + public TypeX aspectType; + public ResolvedTypeMunger typeMunger; + public Entry(TypeX aspectType, ResolvedTypeMunger typeMunger) { + this.aspectType = aspectType; + this.typeMunger = typeMunger; + } + + public String toString() { + return "<" + aspectType + ", " + typeMunger + ">"; + } + } + + public void write(DataOutputStream s) throws IOException { + if (oldStyle) throw new RuntimeException("shouldn't be writing this"); + + s.writeByte(EXTENDED); + int n = typeMungers.size(); + s.writeShort(n); + for (int i=0; i < n; i++) { + Entry e = (Entry)typeMungers.get(i); + e.aspectType.write(s); + e.typeMunger.write(s); + } + } + + public void addConcreteMunger(ConcreteTypeMunger munger) { + typeMungers.add(new Entry(munger.getAspectType(), munger.getMunger())); + } + + public String toString() { + return "WeaverStateInfo(" + typeMungers + ", " + oldStyle + ")"; + } + + + public List getTypeMungers(ResolvedTypeX onType) { + World world = onType.getWorld(); + List ret = new ArrayList(); + for (Iterator i = typeMungers.iterator(); i.hasNext();) { + Entry entry = (Entry) i.next(); + ResolvedTypeX aspectType = world.resolve(entry.aspectType, true); + if (aspectType == ResolvedTypeX.MISSING) { + world.showMessage(IMessage.ERROR, "aspect " + entry.aspectType + + " is needed when using type " + onType, + onType.getSourceLocation(), null); + continue; + } + + ret.add(new BcelTypeMunger(entry.typeMunger, aspectType)); + } + return ret; + } + + public boolean isOldStyle() { + return oldStyle; + } +} diff --git a/weaver/src/org/aspectj/weaver/WeaverStateKind.java b/weaver/src/org/aspectj/weaver/WeaverStateKind.java deleted file mode 100644 index 1960c8d12..000000000 --- a/weaver/src/org/aspectj/weaver/WeaverStateKind.java +++ /dev/null @@ -1,48 +0,0 @@ -/* ******************************************************************* - * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). - * All rights reserved. - * This program and the accompanying materials are made available - * under the terms of the Common Public License v1.0 - * which accompanies this distribution and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * PARC initial implementation - * ******************************************************************/ - - -package org.aspectj.weaver; - -import java.io.DataInputStream; -import java.io.IOException; - -import org.aspectj.util.TypeSafeEnum; - -public class WeaverStateKind extends TypeSafeEnum { - private WeaverStateKind(String name, int key) { - super(name, key); - } - - public static final WeaverStateKind read(DataInputStream s) throws IOException { - byte b = s.readByte(); - switch(b) { - case 0: return Untouched; - case 2: return Woven; - } - throw new RuntimeException("bad WeaverState.Kind: " + b); - } - - - public static final WeaverStateKind Untouched = new WeaverStateKind("Untouched", 0); - public static final WeaverStateKind Woven = new WeaverStateKind("Woven", 2); - - - public byte[] getBytes() { - return new byte[] { getKey(), }; - } - - public boolean isWoven() { - return this == Woven; - } - -} diff --git a/weaver/src/org/aspectj/weaver/World.java b/weaver/src/org/aspectj/weaver/World.java index ebfb68170..792201dd0 100644 --- a/weaver/src/org/aspectj/weaver/World.java +++ b/weaver/src/org/aspectj/weaver/World.java @@ -374,5 +374,4 @@ public abstract class World { return ret; } - } diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java index 8666df8f5..88b1e9b7c 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java @@ -107,8 +107,7 @@ public class BcelAdvice extends Advice { if (concreteAspect.getWorld().isXnoInline()) return false; //System.err.println("isWoven? " + ((BcelObjectType)concreteAspect).getLazyClassGen().getWeaverState()); - return BcelWorld.getBcelObjectType(concreteAspect).getLazyClassGen().getWeaverState() - == WeaverStateKind.Woven; + return BcelWorld.getBcelObjectType(concreteAspect).getLazyClassGen().isWoven(); } public void implementOn(Shadow s) { diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java index 5595b45db..866502e99 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java @@ -61,7 +61,7 @@ import org.aspectj.weaver.ResolvedMember; import org.aspectj.weaver.ResolvedTypeX; import org.aspectj.weaver.Shadow; import org.aspectj.weaver.ShadowMunger; -import org.aspectj.weaver.WeaverStateKind; +import org.aspectj.weaver.WeaverStateInfo; class BcelClassWeaver implements IClassWeaver { @@ -75,7 +75,7 @@ class BcelClassWeaver implements IClassWeaver { List typeMungers) { boolean b = new BcelClassWeaver(world, clazz, shadowMungers, typeMungers).weave(); - //System.err.println(clazz.getClassName() + ", " + clazz.getWeaverState()); + //System.out.println(clazz.getClassName() + ", " + clazz.getType().getWeaverState()); //clazz.print(); return b; } @@ -241,7 +241,7 @@ class BcelClassWeaver implements IClassWeaver { // ---- public boolean weave() { - if (clazz.getWeaverState().isWoven()) { + if (clazz.isWoven()) { world.showMessage(IMessage.ERROR, "class \'" + clazz.getType().getName() + "\' is already woven", ty.getSourceLocation(), null); @@ -309,7 +309,7 @@ class BcelClassWeaver implements IClassWeaver { // finally, if we changed, we add in the introduced methods. if (isChanged) { - clazz.setWeaverState(WeaverStateKind.Woven); + clazz.getOrCreateWeaverStateInfo(); weaveInAddedMethods(); } diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java b/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java index 864f127d6..81d8f1b8c 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java @@ -32,7 +32,7 @@ import org.aspectj.weaver.ResolvedMember; import org.aspectj.weaver.ResolvedPointcutDefinition; import org.aspectj.weaver.ResolvedTypeX; import org.aspectj.weaver.TypeX; -import org.aspectj.weaver.WeaverStateKind; +import org.aspectj.weaver.WeaverStateInfo; import org.aspectj.weaver.World; import org.aspectj.weaver.patterns.PerClause; @@ -51,7 +51,7 @@ public class BcelObjectType extends ResolvedTypeX.ConcreteName { // strangely non-lazy private ResolvedPointcutDefinition[] pointcuts = null; private PerClause perClause = null; - private WeaverStateKind weaverState = null; + private WeaverStateInfo weaverState = null; private List typeMungers = Collections.EMPTY_LIST; private List declares = Collections.EMPTY_LIST; private ResolvedMember[] privilegedAccess = null; @@ -212,18 +212,11 @@ public class BcelObjectType extends ResolvedTypeX.ConcreteName { unpackAspectAttributes(); } - //XXX we've lost information so that we don't know who wove into this - // class, only that someone did. For better error messages we should - // probably expand the information in weaverState - public boolean isWovenBy(ResolvedTypeX aspectType) { - return weaverState == WeaverStateKind.Woven; - } - - public WeaverStateKind getWeaverState() { + public WeaverStateInfo getWeaverState() { return weaverState; } - public void setWeaverState(WeaverStateKind weaverState) { + void setWeaverState(WeaverStateInfo weaverState) { this.weaverState = weaverState; } diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java index d75d94efe..5b9de1855 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java @@ -36,6 +36,7 @@ import org.aspectj.weaver.ResolvedMember; import org.aspectj.weaver.ResolvedTypeMunger; import org.aspectj.weaver.ResolvedTypeX; import org.aspectj.weaver.TypeX; +import org.aspectj.weaver.WeaverStateInfo; import org.aspectj.weaver.patterns.Pointcut; @@ -51,21 +52,31 @@ public class BcelTypeMunger extends ConcreteTypeMunger { } public boolean munge(BcelClassWeaver weaver) { + boolean changed = false; + if (munger.getKind() == ResolvedTypeMunger.Field) { - return mungeNewField(weaver, (NewFieldTypeMunger)munger); + changed = mungeNewField(weaver, (NewFieldTypeMunger)munger); } else if (munger.getKind() == ResolvedTypeMunger.Method) { - return mungeNewMethod(weaver, (NewMethodTypeMunger)munger); + changed = mungeNewMethod(weaver, (NewMethodTypeMunger)munger); } else if (munger.getKind() == ResolvedTypeMunger.PerObjectInterface) { - return mungePerObjectInterface(weaver, (PerObjectInterfaceTypeMunger)munger); + changed = mungePerObjectInterface(weaver, (PerObjectInterfaceTypeMunger)munger); } else if (munger.getKind() == ResolvedTypeMunger.PrivilegedAccess) { - return mungePrivilegedAccess(weaver, (PrivilegedAccessMunger)munger); + changed = mungePrivilegedAccess(weaver, (PrivilegedAccessMunger)munger); } else if (munger.getKind() == ResolvedTypeMunger.Constructor) { - return mungeNewConstructor(weaver, (NewConstructorTypeMunger)munger); + changed = mungeNewConstructor(weaver, (NewConstructorTypeMunger)munger); } else if (munger.getKind() == ResolvedTypeMunger.Parent) { - return mungeNewParent(weaver, (NewParentTypeMunger)munger); + changed = mungeNewParent(weaver, (NewParentTypeMunger)munger); } else { throw new RuntimeException("unimplemented"); } + + if (changed && munger.changesPublicSignature()) { + WeaverStateInfo info = + weaver.getLazyClassGen().getOrCreateWeaverStateInfo(); + info.addConcreteMunger(this); + } + + return changed; } diff --git a/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java b/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java index a5b5c06fb..0c30e8411 100644 --- a/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java +++ b/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -49,7 +50,7 @@ import org.aspectj.weaver.BCException; import org.aspectj.weaver.Member; import org.aspectj.weaver.NameMangler; import org.aspectj.weaver.TypeX; -import org.aspectj.weaver.WeaverStateKind; +import org.aspectj.weaver.WeaverStateInfo; public final class LazyClassGen { @@ -152,8 +153,13 @@ public final class LazyClassGen { } private void writeBack() { - addAjcInitializers(); + if (myType != null && myType.getWeaverState() != null) { + myGen.addAttribute(BcelAttributes.bcelAttribute( + new AjAttribute.WeaverState(myType.getWeaverState()), + getConstantPoolGen())); + } + addAjcInitializers(); int len = methodGens.size(); myGen.setMethods(new Method[0]); @@ -305,29 +311,17 @@ public final class LazyClassGen { return myGen.getClassName(); } - public WeaverStateKind getWeaverState() { - WeaverStateKind kind = myType.getWeaverState(); - if (kind == null) return WeaverStateKind.Untouched; - return kind; + public boolean isWoven() { + return myType.getWeaverState() != null; } - - public void setWeaverState(WeaverStateKind s) { - Attribute[] attributes = myGen.getAttributes(); - if (attributes != null) { - for (int i = attributes.length - 1; i >=0; i--) { - Attribute a = attributes[i]; - if (a instanceof Unknown) { - Unknown u = (Unknown) a; - if (u.getName().equals(AjAttribute.WeaverState.AttributeName)) { - myGen.removeAttribute(u); - } - } - } - } - myGen.addAttribute(BcelAttributes.bcelAttribute( - new AjAttribute.WeaverState(s), - getConstantPoolGen())); - myType.setWeaverState(s); + + public WeaverStateInfo getOrCreateWeaverStateInfo() { + WeaverStateInfo ret = myType.getWeaverState(); + if (ret != null) return ret; + + ret = new WeaverStateInfo(); + myType.setWeaverState(ret); + return ret; } public InstructionFactory getFactory() { @@ -531,4 +525,5 @@ public final class LazyClassGen { public void forcePublic() { myGen.setAccessFlags(Utility.makePublic(myGen.getAccessFlags())); } + } -- 2.39.5