From 3b4d09438dd366cf4bb90c9d19cc8134853a347d Mon Sep 17 00:00:00 2001 From: aclement Date: Tue, 21 Feb 2006 10:49:15 +0000 Subject: [PATCH] optimization: use tags not gens. improves memory (create less garbage), faster (dont need to transform the garbage): see pr128650, optimization #6. --- .../apache/bcel/generic}/LineNumberTag.java | 7 +- .../bcel/generic}/LocalVariableTag.java | 46 +++++---- .../apache/bcel/generic/MethodGen.java | 85 ++++++++++++----- .../org/aspectj/apache/bcel/generic}/Tag.java | 9 +- lib/bcel/bcel-src.zip | Bin 872478 -> 875449 bytes lib/bcel/bcel.jar | Bin 595683 -> 598986 bytes .../aspectj/weaver/bcel/BcelClassWeaver.java | 3 +- .../org/aspectj/weaver/bcel/BcelShadow.java | 16 ++-- .../aspectj/weaver/bcel/LazyMethodGen.java | 90 ++++++++++++++++-- weaver/src/org/aspectj/weaver/bcel/Range.java | 6 +- .../org/aspectj/weaver/bcel/ShadowRange.java | 1 + .../src/org/aspectj/weaver/bcel/Utility.java | 11 ++- 12 files changed, 204 insertions(+), 70 deletions(-) rename {weaver/src/org/aspectj/weaver/bcel => bcel-builder/src/org/aspectj/apache/bcel/generic}/LineNumberTag.java (86%) rename {weaver/src/org/aspectj/weaver/bcel => bcel-builder/src/org/aspectj/apache/bcel/generic}/LocalVariableTag.java (59%) rename {weaver/src/org/aspectj/weaver/bcel => bcel-builder/src/org/aspectj/apache/bcel/generic}/Tag.java (79%) diff --git a/weaver/src/org/aspectj/weaver/bcel/LineNumberTag.java b/bcel-builder/src/org/aspectj/apache/bcel/generic/LineNumberTag.java similarity index 86% rename from weaver/src/org/aspectj/weaver/bcel/LineNumberTag.java rename to bcel-builder/src/org/aspectj/apache/bcel/generic/LineNumberTag.java index 9dc5b8a15..b8136de35 100644 --- a/weaver/src/org/aspectj/weaver/bcel/LineNumberTag.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/generic/LineNumberTag.java @@ -1,5 +1,5 @@ /* ******************************************************************* - * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). + * Copyright (c) 2002 Contributors * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Common Public License v1.0 @@ -7,11 +7,12 @@ * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: - * PARC initial implementation + * PARC initial implementation + * Andy Clement pushed down into bcel module * ******************************************************************/ -package org.aspectj.weaver.bcel; +package org.aspectj.apache.bcel.generic; /** we don't actually target instructions, but instructions target us. */ public class LineNumberTag extends Tag { diff --git a/weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java b/bcel-builder/src/org/aspectj/apache/bcel/generic/LocalVariableTag.java similarity index 59% rename from weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java rename to bcel-builder/src/org/aspectj/apache/bcel/generic/LocalVariableTag.java index 14bb30acf..53d43c462 100644 --- a/weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/generic/LocalVariableTag.java @@ -1,5 +1,5 @@ /* ******************************************************************* - * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). + * Copyright (c) 2002 Contributors * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Common Public License v1.0 @@ -8,15 +8,15 @@ * * Contributors: * PARC initial implementation + * Andy Clement pushed down into bcel module * ******************************************************************/ -package org.aspectj.weaver.bcel; - -import org.aspectj.weaver.UnresolvedType; +package org.aspectj.apache.bcel.generic; public final class LocalVariableTag extends Tag { - private final UnresolvedType type; + private Type type; // not always known, in which case signature has to be used + private final String signature; private final String name; private int slot; private final int startPos; @@ -24,22 +24,26 @@ public final class LocalVariableTag extends Tag { // AMC - pr101047, two local vars with the same name can share the same slot, but must in that case // have different start positions. - public LocalVariableTag(UnresolvedType type, String name, int slot, int startPosition) { - this.type = type; + public LocalVariableTag(String sig, String name, int slot, int startPosition) { + this.signature = sig; this.name = name; this.slot = slot; this.startPos = startPosition; } - - public String getName() { - return name; - } - public int getSlot() { - return slot; - } - public UnresolvedType getType() { - return type; + + public LocalVariableTag(Type t,String sig, String name, int slot, int startPosition) { + this.type = t; + this.signature = sig; + this.name = name; + this.slot = slot; + this.startPos = startPosition; } + + + public String getName() {return name;} + public int getSlot() {return slot;} + public String getType() {return signature;} + public Type getRealType() {return type;} public void updateSlot(int newSlot) { this.slot = newSlot; @@ -51,18 +55,20 @@ public final class LocalVariableTag extends Tag { // ---- from Object public String toString() { - return "local " + slot + ": " + type + " " + name; + return "local " + slot + ": " + signature + " " + name; } + public boolean equals(Object other) { if (!(other instanceof LocalVariableTag)) return false; LocalVariableTag o = (LocalVariableTag)other; - return o.type.equals(type) && o.name.equals(name) && o.slot == slot && o.startPos == startPos; + return o.slot == slot && o.startPos == startPos && o.signature.equals(signature) && o.name.equals(name); } - private volatile int hashCode = 0; + + private int hashCode = 0; public int hashCode() { if (hashCode == 0) { int ret = 17; - ret = 37*ret + type.hashCode(); + ret = 37*ret + signature.hashCode(); ret = 37*ret + name.hashCode(); ret = 37*ret + slot; ret = 37*ret + startPos; diff --git a/bcel-builder/src/org/aspectj/apache/bcel/generic/MethodGen.java b/bcel-builder/src/org/aspectj/apache/bcel/generic/MethodGen.java index 96b2b0f90..e414b94e7 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/generic/MethodGen.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/generic/MethodGen.java @@ -86,7 +86,7 @@ import org.aspectj.apache.bcel.generic.annotation.AnnotationGen; * use the `removeNOPs' method to get rid off them. * The resulting method object can be obtained via the `getMethod()' method. * - * @version $Id: MethodGen.java,v 1.6 2006/02/14 13:32:07 aclement Exp $ + * @version $Id: MethodGen.java,v 1.7 2006/02/21 10:49:15 aclement Exp $ * @author M. Dahm * @author Patrick C. Beard [setMaxStack()] * @see InstructionList @@ -100,6 +100,7 @@ public class MethodGen extends FieldGenOrMethodGen { private int max_stack; private InstructionList il; private boolean strip_attributes; + private int highestLineNumber = 0; private ArrayList variable_vec = new ArrayList(); private ArrayList line_number_vec = new ArrayList(); @@ -188,6 +189,8 @@ public class MethodGen extends FieldGenOrMethodGen { } } } + + public int getHighestlinenumber() { return highestLineNumber; } /** * Instantiate from existing method. @@ -198,6 +201,10 @@ public class MethodGen extends FieldGenOrMethodGen { */ public MethodGen(Method m, String class_name, ConstantPoolGen cp) { + this(m,class_name,cp,false); + } + + public MethodGen(Method m, String class_name, ConstantPoolGen cp,boolean useTags) { this( m.getAccessFlags(), @@ -261,29 +268,63 @@ public class MethodGen extends FieldGenOrMethodGen { if (a instanceof LineNumberTable) { LineNumber[] ln = ((LineNumberTable) a).getLineNumberTable(); - - for (int k = 0; k < ln.length; k++) { - LineNumber l = ln[k]; - addLineNumber(il.findHandle(l.getStartPC(),arrayOfInstructions), - l.getLineNumber()); + if (useTags) { + // abracadabra, lets create tags rather than linenumbergens. + for (int k = 0; k < ln.length; k++) { + LineNumber l = ln[k]; + int lnum = l.getLineNumber(); + if (lnum>highestLineNumber) highestLineNumber=lnum; + LineNumberTag lt = new LineNumberTag(lnum); + il.findHandle(l.getStartPC(),arrayOfInstructions).addTargeter(lt); + } + } else { + for (int k = 0; k < ln.length; k++) { + LineNumber l = ln[k]; + addLineNumber(il.findHandle(l.getStartPC(),arrayOfInstructions), + l.getLineNumber()); + } } } else if (a instanceof LocalVariableTable) { - LocalVariable[] lv = ((LocalVariableTable) a).getLocalVariableTable(); - - removeLocalVariables(); - - for (int k = 0; k < lv.length; k++) { - LocalVariable l = lv[k]; - InstructionHandle start = il.findHandle(l.getStartPC(), arrayOfInstructions); - InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength(), arrayOfInstructions); - // AMC, this actually gives us the first instruction AFTER the range, - // so move back one... (findHandle can't cope with mid-instruction indices) - if (end != null) end = end.getPrev(); - // Repair malformed handles - if (null == start) start = il.getStart(); - if (null == end) end = il.getEnd(); - - addLocalVariable(l.getName(), Type.getType(l.getSignature()), l.getIndex(), start, end); + + // Lets have a go at creating Tags directly + if (useTags) { + LocalVariable[] lv = ((LocalVariableTable) a).getLocalVariableTable(); + + for (int k = 0; k < lv.length; k++) { + LocalVariable l = lv[k]; + Type t = Type.getType(l.getSignature()); + LocalVariableTag lvt = new LocalVariableTag(t,l.getSignature(),l.getName(),l.getIndex(),l.getStartPC()); + InstructionHandle start = il.findHandle(l.getStartPC(), arrayOfInstructions); + byte b = t.getType(); + if (b!= Constants.T_ADDRESS) { + int increment = t.getSize(); + if (l.getIndex()+increment>max_locals) max_locals = l.getIndex()+increment; + } + int end = l.getStartPC()+l.getLength(); + do { + start.addTargeter(lvt); + start = start.getNext(); + } while (start!=null && start.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 delta 12808 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

WvMdf1maQaJc;V{3f^BP4t?UpJXM z9raj=ri>Bozak@)wUyaP-ItF;_&ds=Vm~3tM@cmrt$^??o9fuRog<2TMjVD26F^$~VMq-u1)t=Dp znWZQSUEFPri8J9sw&EI2?Wj7O9RsP+(s6X)tuU1{B33vI{br`UI%kT3MQ}L}Z!`0k zJJ{i2;S&Ma*8LkS5t!BzImqwQ(y+~j4(4(K$7xHPKXU9cHC~xEHAzy}C zR&`JO_?~-*Q?wbgKV|L?l`^dsn+}h(vQsIw+prqrPYn?L@$7vau#fkZ4-&IAj#q`- z!uctY>{QNDds51kS0PWnP+Xb^23|a`Wk*y|r=|HIyLSX`ulPVajFGR)aRx<4jQo(s zMJ})ygql23H2s5j#rhE(zO)&Qg)fe&1=QScYO-SEd+tHKgitP+>T`gVT6f?%BXJlf&J*N zjmjI~%kLukFL2(LkOsk%`+-n~_TEL{b?WH^fzDxJ2BYTl8c|O7I+>3L<4X?HYTb`J zU?Y7K;uD>Z9{EC^JyxsO&?k*CryXc_@cN1cI zb)dOTm{kn}<0m7;i~vx*S?}tP7E2^hLqOfO{A9F%yOK2W3&i; zPMGn@sA@Dv4~j>(r}U>HaNMS+0oui?&qHQZ>>b4-S= zd2c^(d=4k=ycp|GBEgA8XgG*G4O%TLs{*C}X)X!VE%ZD|Se;PWnk?cAAw#?jmUU?$ zI-(HzC0lB%{uO<&d1H)Qfeg=8nDOjzCZfAZy&mXF*oSjYP%i6aYHz}|m>9;pZ?RwB^!su&h6%i!Gi>Q|S^-$a8AIb1k>ttB z#jO<-8S_#ZKXm5XG?EdW!864E@ttsJ*G-w=)$l>~91)oR4hF?Z@{ll%|W?cr$hhcg?rO8JXM30 zBl*;%rw6A58QahnyZs)3@#*zGQOo z**Iad8#RLnlvjl|+FjZeqN|GkxIAj;(x#LfI^cPn*D z%|hmjw|KmA&;CwlExvP_dZy75sACBrEbmXfCd9~ zl_pcXKe|VreQ}&W+4Z+}G`i-vFVZevK*>hCo7G_CPyN@uIQniXJu$@XyDPGO91XK0S%~mDXNhK-?4(sG)SHA#oYP zL2^A#zHwUMlWg9lMhM1SRZx8|Mb5LWz6>V%Yxs7zbJL8yD%6+v0rSvzSN| zV)NepZ9ZH%!;soy@oO4|l0(zvhYNNu2VtiYJFrTB-gMyTj|a#%KfRDstH5Pl zbywN|8^2nilOwhY$KvckFNrg(s)^gSiZDmnYojF0aG|ki2H=rh!QdSn`OPrPppZi^ zX~TeI5QXJZ1!f@eK=mDl%l}&2%4@WQSd7T6wzm?GB3?Z zszO>RU)yVVSs!t0$E8cR+fU{t6FWZ-@Ezte7NudtEDZb=y|*iaEGGLD2x9p9y!#LaV%wMa4S*-Tp^nl;J65O;(JwPZXI`C)**|B5qoUy;8PY+5i6 zws*{tTPQ*&d00-ig-yGaJc}ED18iaD*QH`sq#$?3sA1b+Cs*ux`z=CN-dv)@9RU>2lkGy z+U{(T=!;62Y;7k&Q_YbG&k@wq6UXTvN23d@igMp5xaZ_qD#Pv36WG;Igx0H4m0-{v zr_SYw>xhr*@pgyISpG)t?WnGRyL%pxGjBckwvn*V+0wA6xXN9rns_^KOya#fCK>WU zweq}w@s8{_n_G{fz2LF^-|#zSA-4l*LDC(42sn(0~!E(PO|gg@RDl zLgA4*itET3w!NK6s?fnf;g;mlcOASfHSvhlE3WNBqtt5^tD5&wax0wyuH!VHH`5sD z1xXQmn`8725F*J?R*760o9-}ehz>(%zcWbTgr%s*uHoc!)*9z>wHA_`~a&P!EkpAKe{6APW5e7WYfsieQ4 z%BPvff|-+GFs1$=K6?&he{Eyts#+2eL53x=+|r_@x4`llg1M6|O8S zXeJRHg+5DHhl`-`4+vJ(RHAG(S;f|S{sqm7?+G?jj#YZGul23y&4@;{81dv#&+NUS z?^|v0Cid=F{K+d4tkz>_UFCiiop1PIokHTP#KJ*7y)l?1D>b_h%+hESGlU?vb9d+P zX3^*yN$~4%>UZwhR3?YrFbl}*xS<%9PLOwslorDt$=-Y)B_jS($p?ou@=ej-Bc1}J zL)=9Zdxqp&f=T#6m-0jFbvTdc>)7{6i))z!yMuANNWby4=mG2Q|796=Ndawhm{@~Wh>pm+8)rSU4GM$Ivs?`RNGn_!qDj7UP-zj( zP7-E$!X@4BC|xr)EmGD(s7pM?voQD=S~Wt=ac!THjs5+plV;1%Ck? zc9u`9;p7_S7yrJlh(M}hSQT=71PvQsnK=LPy!j@_e$uArQrwc(Keq}T6#WjU3LzCt zpWOfM*-vDi$G^%EE&Y3E^~|{s2;!OF{1$$A!wx4}`U>xZ{a0n#WgViX;&8W!#X{ch zvF({H9|yJ5wG@9ptb&dq+BG^GxNz~{sIa_WevzUm%rvmXR0smg)m+0(M43)mRR__G zB%+Fb5xu^>xdxb@aQAdnfq!-)oLL2B@2Ao|5s&`Lu<^BNQ)SR@2!r?j$nbaD`3>CB z`RvPL!)-Vh1j9QlZXTnP(es*Z#RXi1$)`-+Mhkr6Taw(lK$Vn;oKj%|{l)kH)7|`5 z1-W=LB83|T(oi7{tvQ7oeIWDY&B$iMN%YqSV6_=^c<|LLAPKnY6_6erw1or&i!lS4 z0SkLzY-%7aIF1=80x*2@hU5j5}Zp8geUvoJC`sp>@ffP6b84DLv0~%VPb%l*dX2x zvi}f7a4s8=A0V#;B@b*sZoq3Ts8BIP27-;*Ar53lP*TYb>Gn5=3a~vg4p?9X9Sf}E zij0N+|A#CLwzq{Egu5bRf`tu$Sm0m|NL^sp7fcK8;Q(?0xIRFIauB2>3Qouvi-9kM z4(!AU>2{BJ5qhw(;9O211GoZ=j0R@qf>?b5L;d`?fWiRVEU5U&1({!q050Y>d7F3+@K`PH8fC?pkNDl|a zi=YM9@B>Mq`zW0o<=+c}%=BVl0Vv>r8jcD;meE)YDkv3D@W4H1kmSZx|KlYj1AhMo z;`K-2#gGPk_y#Bs_^AdJUkp&t!Hq(YwRIJQl#OW!-V_3|fjf86QNa`+0O;UpLC6@n zCjY`hLJ;!a3QDr}(6PZ)FGSG(g}4CNouNHJ!a!Moh5J7O3H&Gw*`aPeP$CkBLIge) z0iuJk4j{K(v%l0n(7ZZc2Bp`c$ef?k9K>`v!@AO~9ljswmAy*-y53| z^kQWUxQPT~%K=RR*@;julP{=*;3_%D^i6(-lK4VY;7c4VFtI!&eTot&Uav*P2Rq6` z3@ciogz_yA6FeplS&&b?{}4IA?C?JV6P)oDvJ7}rPy!hX0sQb5Qh>}ll;|h`l>wpq zP%*3kR0Ld|LWO`LPyt|d4HYGdz_$SKJye`20TIAP2xt_L|BXVDlvjcz2?IGYH6RlL z=|cp^DnZV;P~?Az9smOqDyE3h7@%JCRA~R6omBjP3^2gw%8;bqll_ahr~tJ9qO?%* z%!bAc4RX)(pCES3Py-fTG%T>S3?#P@RY-1KoKOrBf~L$2DCGZ#pn{zx(P*II?9?FE zonp|wKm|yU|J{TmFMUN4&^}~!$Q0H~y$BYtzX}>Q*k2v8F4PK8a-@ZZ4qksD+iEX_ z6+|wICs0Z$Zi92_y>+Z3t1>c_EOey*6YO3;#gH`HP5w z0SD^>Ily*0kbR7Y3>7OnFGn~TR4D2Kc>rc~FTxJs$qa>L?|{+(eIuw~v_U5Xm%f9H z17igx6E5hu;QeXHG0mU{skYh`iv9f|=V*u?#BeJRN~)tEhUYJ2FBwV{^&vGOfB8qC og1hyBoB*E|@P$6m6EM&X?ExDA@h}2l17KHTVPM$$ULNTG2NkGq?EnA( diff --git a/lib/bcel/bcel.jar b/lib/bcel/bcel.jar index 709d6194d166ccc2060f5c215b89b92fcb86e2cc..87bf5b75bf5bb31ae5a4b61794da5b715c65a489 100644 GIT binary patch delta 29572 zcmY&;1yodRv^EoTcb9ZXNr#klw=_t1N{I~JjWDE?fHX);cO#*6mxQDupa}ms^Lg+6 zT`taMpIy(c_sn5-su{50Kwu1{zyIu|byKiuL4PmYEbxmV7bpPsTkI2%KkU*Y z@%NGnQ2fhGQvt|=9OZS>QUGEgU)b-T0P^rF8BiF0)d7m*!}$Dg)BpWoO0xtqLg_%L zV6y*p`~M3;x2}OS&`nHqf;2o3`d>?_05<3}Ga7N45eVb2=LS1aBP*Ps;VeUe6C->R z$bVyNfC}@1;l#Lj5(rM1O0A*82?=F90G!ZN2|y5&s@aHJj{1t2I52ho*n>4Y8x$lY zcU&mF5{M?PM;HTI9e_sI@Y~W2<*#zFi#@`TyNd@HuA&xVnN0&mLVAJmKPqVj_Gk^X zo=*^w==p#UgmHiu5FWrxAQ-_}3`Rv5AvYd-$p}P3`Ur+fU7^7J!i`Wz$Rkv2qfihk zZgD;c&Ot&sLRY%z2VM>=zZXbp7Ct;_pHl1LafK}^JtDzELei#8^N8YU=t^V9f;&IX zw?|mge@BNP{NLxou{Ds@Vk5w@HV)&!jjVkaSxQAlLQZ>zgA3;sK0m2cw1|9$#1h3l*KngEh%Mt|e8D6lKx^O@y zA}W~Sbx=nGtNLX(4JfXCiEd04YMWe z9e@xKT2>h#3IrE^F}jy}3=?KShIUh;{;xD@i&-TA6(Mb31MqtSmtO8pz%>BD+7BDr zQ-Ek)=;Ks0>=uS?fF(jWY7c;ks6zS)zze~{yZ|U7(CA+Q&=5S!8-N&smwyLvLg2y% z0qYTWdr^QI2p%Ceunxf+!UNhMC@v!41ES_URKO|(Z-W+ShM=SvfLiG2e;fSP8ZVL^=yK^QG7oWKc0;w!j-q(C^XvmeF5oUklJB10{K02*kW7!bYXCl3%Y zkS&r=fU^L&V3Jd5BqnSDm|?&Z02hRgXQSb?=n4Rd5qO+MfMkezMu`Dkf$&JO+X5Kg zKs8B094%~5ffWGkzv2CovKhmLc`b%YI{;arV!5!sB$NV@!w8aLxfSS4kSW2zh~XLo`KeJ0XbT( zG=cy1^QJa%03ldr0L(-L6uYm+eFF(XzK7Tz5oxFl2Rkj(pijX#ku8BeG zK7u%*9i?a(EvBu&X#mI%w#|4x{w)TK;*Wkq#e^sZ)U^x^8ye>X#B53KfC<8HzaG?6 z=Z0?e0J)))WoW1^`CUK}Al$@C56~Nk^Vh@+tzR`zSQ{9iLANA<%+OcwVU3g24=e=1 zO{kofFAPKLKf-#=dKiWS`>)Od&IC?8EZ3M&-q&Cj=;LzOJ_s6xB@nJs7)9CopNir* zOa;#L_!M-9U_#f+VQ4HTfis9ZBXt|2|B2gv`kSf09y(-vP@o~9l;pz!ai;x`vqJ^fQ!s&UPl!6buBCvJa@2q!7W(l zFA_l$t-+iv{P(~exXUIA5Cy_~siX8)XgwIj15K>^ivNfz zkS|(2M*hwKCv^HFY;N6*L9n^~+onfgW~5p8GK8|U|C_%A(|D~ytV>4BRqez0r>#oL$&E~f4~FVm+8=pCJ-w$p#vsYU=I>S$gMeoULxc) zN9?x$kDNp&OfK2wpWLJyOb+hSyajgydSL_Nf}VDwp|u2ig2WJ}y1YRlh}mCsKIG$r zxqOEV@AwukUy$N|GX5|bIK+rbvK?WlRtU_FaW`x=ga(3S5Dv=DpnFiw5YUsBhaiv= zLQf?GrUy^>r!W`=55$ooG8`cn7YUPt^TyV6WZ*m~PcJMu(io65Ld`htpMi}85FrXY zGi4ubZ~xD_5$i+4ggRowPG7M%pm;=i$I?N`2+9-+NIhCPY?T{)IoU<^c}UG>2K zB_Ci2Rz<|AX#)Ols?E*7|1CThi+|Ls7yqajYcLVQZGkQLznQPI2g4qY{`#131iKKoL_{pF|Jf3PfJ+e;HbcPwEpzO> z$VO=J3-IHXy)f_+0#|Ruzlc6Xfu|5w3gZ7+sY`@efsedGDG(6N4=s(9US^pfr$^qjcLQTvA z<07bnd~gLA$5dIDKjX?i=?AQvMnF)lH53}C=4&uIly(UX9inS#$7SVg>E)HKJ?=Uu zMI=GEqU5+rB$FLUaloLt{cMmH?=!MuI=fsQS}eFdMy!dNTuc~;wm%kk1juO5l#J(m z%Q`^4f}tM@cD6k|&VBVM@Al&RcLP>o`J^r3Sks(OrF}}wg881qgg+PYLr!8f2fD0q z?=;2px+&srL?FH#7FZ|U(z7xV(zqGVQGA9pgLb2WJo^fKrmFBwHHy4?3%sjRLNL6k z*=xwBHP@xkbFhpDPj`YHkHbc`dZUNCeta*;_PdYorMZJ=}?_Jd!-o541BfBtF6z)_rMDvN8>zPR}P8hS^nE}Kj&a%A$XX;(Hs8OpL<!q@R2FBe=z7bXK$Gvk z^y|u!KZ)Ao$nN*!nuEe;+rc!l$Wn&4g4Pb!2AU;aVI4YS(1ZDQ1D=ojET5ky8}yOn z3H-8`N;?;W=&tl#eO9UT2)ju(N=@%Vb1h2oS}xbf`$(&0%y~HG;4W0c`yn(pa`emY zCZQv{R|2>jE=f5?EhlhiUA*8jFsg6@V6p#jmoYY-k9 zhXr2p5ZVZC8WUdcGCQ4-6i=*0$gHEeNnbW6VXAk7L)n82?dwX7r&lpiKBb%Sd5513 z9^R{WzjDL+V2zPBy6$!Q)~o9*={Pim(!dpE;dwD6vDLqm2RR=mrgnnj>hr5!VmtA0WC(XL8{ zfmarh@mfPrBcEL5n@`RGH9BKY=yX5)yyen;oFM^7A-1m$$T*gGY~b+mXO~|2Vte5C zT-V+T5|Z)uc(*JsymGpSIppy5&Y z^Rnbb-aV>c`%MK-b10dF+P+*;{~D`pPmE&<9@C3~(M{btE-|Ogr(LP&n7|P73^M{n zA&x%~|k+p z(Q%Sm$KRuLjOZ|S?AEzGp?hhv`$YaMy#f@U={949f;+=P`)B`#e%tmJ9{LlHXg~vm z#XGuCQa9Zx&`d|sgYS^x=+Uvcv=BjSd}Sbx1zFe~DF1l*E`gnyfy}B@GsBuvGh>%h zcmAaj{UEpD*K10vUAD=&JJnHcS9QhIR9eGGjXElZ$lZVm&rD8*5zjZA!w04cv5KjO z9r6x50=!eyg;n*UIyxRW>>L%D$|{}^oF{yfZr%I2TkKEz_wyC+)(eWq6F7urQ9o~i zne|d7{Wp7{xvtrP#cZCdN#Zm7{upy=scMi*>$%;WZ*}TsmW`j^uf>n6*HOP7PB_pk zQsec=?pxC>33%xzd+xKUUCefl+~wT&{!{H>b!oh-P~#%=``K^Y6XJ1`or4nPkOO=Y zE8N6$O^gAipNcE!Tnf*x@&on>yp`Fs% z`*@RuLS#kc3w4y;MLA|NpgGJaoKV!KZTliF*Y+C*R44-KvNcT3FXA{wSr>#>F{e+R zv1Td*gh-;NA1Hi3a!tKV7{a9ZqqIUwn>SE4CDl(6z{}FU$eosCcqsM|Y@TBy=n>(2 zM89M$LZ0;gm(^+s*KmUA`zPrq_ciN_b`|sAACUgPP1G{p{BHq?w}D*{2U=A-SRWM~ z_KunVK>QN+HUP69tOzmIAe1J$k7RpOgSn?YCa0-8U=}Wy5*I8a#icYzh6dhf9#_e|`onAiT-+S-kt znJE9rLRDAOxsxiMTx_*ZNAk+{O0w^oURuWFI@n)_r;SxjVpKxx_{xms9cN||hJ$z_ zBe7qrEX;mvs#();#S5m*E#x}<`1r8x<<=rr0{X(^vrLD{1ZunY8+iDdlsLkwc0F(&|Q9kT=s_VT5Yx=@v5wv-9)u(}GSE z8bXtQd@t7j6@ktHu{3%?- zfM@qHJZ?+sTyDa)L)mlH0@~JQ6`R+et;lM?48Jr7$#eDIAGt<4lE(K|aOOSe7cO3U z5P$WME}ib5rc`>9|L)>o!Wc5<{$*Mch0p4t6y_vdn z+=Yn_gXlR=LMT1o?N$*q$F6)Zq+g|PB7Jh3OK+Rb`S~cs) z5$7d^uGbj`T4>e zO?=(3XAtyEf2`iTAfx+PaJLKx5hc6gB-rs?J^!@*e2H2JNTDGm!6T$=t=56 zl7VDVp*{BNGAH(~ai4Lt4XG`+nZ6DDtyfSU6Yx2j@qr7`0(!GjV!6Wi=ocj)w`Ak1 z#$F7OMwbe#`vx0xyoLxL*<9X%Je(N@B-?K4Us#tHxR)2y86?YuDyysKdW-qz>im$i zCGpO};kgBge(9p_(s@*wLU;E)HP3LO@I>f;2kY&7hB{D)>I|!9DXrb!Fp)lLJqO*fUf2?O(Cey>bP7RVO^uGO{2u4vtg?);Y^sx< zat?kJZ<8q($;KyYxXYTP`BI6HWKU*~{C4b!aELulgY_x%GXl`$?tFIgyZnUjOp~ z8D1fD2;xzF?KQfe?w6|@k?Sr)K7T{YVEPz&JhZfMCdFV&EvXDTrDQrXO$$ZlQ42ow zEOcN~O{-pe+ZPLtBE`nRCO&``xZ1+F>9G;i@yo|A$}ZJknvK#oM6Nq0RGA6+M!UO% zy3ZbNZBAcbue~~L`}+3JdQ|t#uNe?s;d6*t3{P`gQ&5M{;&vr^HSL+p#XSGbP;KRf zKw|ARa$xm+_QhV8rmWWq(7XpFny0+>^!uMK`BT#+iYJyl9@UMR#$%K*k@cGFn}DHvZmjfi+UO7^PYnyfCx7)>sOu zZyQ=sG_8w|beHAXt!_h-zM;ft{wZQ;NJr-AQi*<>1B(08izhw#4h1q!;T9eH(uMvl zjlm;pftzE>z~1Q>kRF4X`NpY**aEj7&A&R2DPB7X{&K|2MM-s`hwR)eRadW1G7rSd zQ#3FappZ+<1?D&gJ{B*(_=YCXC}>Uw;is8(%659~7}P*tIkq&JR)zDf>eq(7Qme>7>YiT2Z;N7>Q` zKG)1x^c=@W7afCh zk3$;BkF--=-f~4|r2?1IetSPh`Ff5KjZ1yM`RyftSqt;KR*w>#uQCE|Oyv;z_IwhO zOSg9=d3OA7lX$xFo$7iiLUqqD^&&c|`A2s{>;KUA%eWOZ&j^{Ka#wlv7|{{iFj;&D zHi_QEmx_k#q*>xp^5b=L)pCjv7S?G{?fZq@Qw-{fRz+cI_uy9T{$>p&#*ml=+M z`$qM^u2ykN{3P{?zhL{g+IKra$3hecPuA;rVZ3)a-nH7MPDfa4>B~o$O-(3o+JkvS z4ejW^EHcbt;tM<;UA*_>wa)J+5>LfdnZ`?00^wn&8aEXhO?O9}OH1NsFt8WM;6pq;G6ccN~o$B=bEz852=t2VmQ0JNe>F$x@*<2 zKrfPQ<1Rec@f!f(_S2-!?G7y#q;;m%SMHy0zQ$R^OiC>vuFAG@AGUH9rTMx%I>Dkr z*3K(7M3}GX4#XI2RWy}F8<#z2B-~@uCIDBhwwK3(z|?PTQI;{I$|cBF?y=g{fI+V3 zXiXe?3RKrBRy_@n$Rzyl+x}JqwIdvMPZn)#RIB}rJXxQ-ek6;2veBdU_5_)FmOd=6 ze<;mB%*HJYaVHkxnIl7B)6v7*z1H6vHzjas`T^LwQAwQ7WN0S zs|!~xrPN$vYT1KMWXNXcD@sd~hoR+7Q!Am56z$Gy$)O)aAn4U=zt0s=J5Xtpv3|&n zjJ-TQ%-iY;JP5XO?mvkHHCor;(30!kVETK$yqBt$b_%~jwgD{_hxpsl_HX!^ODgq= z9r3QB?eFBoaQEV; z)J=yuS4&&b1B5}gNGyM#%bSq2IYg9-zM(9*G+tkj7LRZo~KZ=hW`e3~h_zMOJHsufaKb*7dyRp>(%RT$?RD7+NH zsJPl+-fYQ*+^Kp5zV}JZC|S{zIb;-H3h~d(e=~I^xERSmC7jyHsE@1sb%%9td(-~I zCy2Yju9vY%MUS(dRkUG$>`9R5yZJn~An;72 z5s7mPS(Oh$q9=#bo|tABbz83+rJMezx15Oboa_CjnnF^@uJ_#Sr3=QPu+E`UuFVa( zN_JS#J{9#Ri|6@U&KLlr*J_iLuh&NKK6`MLWrMZBxudESze%Ov3aV#Y|voD2n%U{9-ftyh9&X1A=@?|O=sTD`#mUCz*uE2d!o6pG zcy!3RNg%!wlHU48c7g17=?-7IW1knE`Wa=6J)iI0Y_rtJ#%|o`(6W03`Ne>(eM5WS z5Bn*DVMmk09xo5#tF!y5$gf__(fox%pC@i(U5m#jd_wC`7D~4rf6Rgd^@R%=+dym~t*^~=$GY2u z3g2c1Tkj)Oh_VP7h^~FHc$N4l3%2EF+Xdncl^_qrk9^ofHp{Ex5<*Ata0cp`8yCDP zMtqBOwazl_-tjy@^gXHAC~`TRBt4ZNp^FO`FQ1b-^BIj2dVM01Rb5T60f)Z;E;vwI*k=1 zDTKj%THhu<)8f40x z-`v9Tk#`5de`X#UPFW4p!HFXIu~)PtcJtLJ{L~Ov_W^FjrqBGpI*1r0$7}A%0u!$b zAX&JirOY1j%T@%5R+$%Z-gm_J*{`RH!O6`zKR&+$^f2ftPK01b(ymH~Yej{Dg3J5W zsIKFCH&VPKvnR!Eq+1%+xllBwOLvZMUeVm6Jbr^qcG5fIU~?!Xsq2-4W!T8nZ4@fxfznywBvLN+095?J|8@xNgbcq0`2h3)=%G(*eJBWo$PG*JsJSbz%Q3!dCV~Tc~l!R zSN3tFK#e5Jr!_W0Kq(_ph73J}@tvXbkP2KW z`BS1t+GY(;rtBBsY=oSZ1~X$|%PyXrJY>_yi+K_czMyiu@%y-& z0%fTA$3xP$ypdtYX(D^k)XK(4QCLs$vps9qEb$K4D%Sv$+)5fhl!CeTOWaFM+Q z%IH4Y{Vpy2>9qdX@#NuSz$(`1b>9?;ioc~^$_Oi$tfa8C6A$}By-UQO%q8Y2fkeaj zN;WDSmj3&FYWl9wdY$32p0SRXPrvU`T>(*PDaz0o zc=~RpNL``Q-Mw0xl;dVO8t<68h$4p3wJVYS8R5oEAbSy6Q9HYlF0;OKoopA5!_jBO z8b75%jt zNpz#SYAyVOw+45R@=yDUN>xzYCP>ADqi>`OW%iq3eS*xPk$G`a$z~LUNIA{>4{OYs zQheC2!O7mts?0^#RX*PJl-p%Mt?&T#w)#$n(!x?uG9k;K_6wpml7hIrZCA668b)_j zq#ou|dh2B)$4>hEnGD^bP092hM3N+uO2pT(YrAb%dA`R=FQzys6D1pLS(T?}LsI5C zKqQ^+ZkB&I1~f*wF?_lqN`}c`778e(#~ZW;zLU?rC_X4HNs^|DKRvC5NGIHnT()`B zBb;#X(r9`_qx?+7rRx$f@9JUik#MY2X*=t>^R#Fs1D&M_7M@M0pTQ zt)nC5TNxvI;?AJfMJVWQTh26|#A;E$Bi#KMDYy5YD+np&(;^@BTasFy)Y=Mek&49) z2FQ)T6;qU-M2yb4>rZABmK;9@^w*u<>wGzW95HTB#>Uw9mj_m?bAFX#E}59S2UXBoqipX5Qye+l&kMnP%3RI-5k>`Hc)n_v;?h71kFP5dNP{nL`oj| zY7f(I?!ZAWf$=We8>*n9)qTqi88X6ph~v8%Y+m$O^R<=;4eWF0@QJQh^Q zmZt5mIOGdE;L@>X)~YCJi|7U%e=gO$+}l z@C=#L|0qY@P<6nbxoN>1Z?~CpJ&*{ua?8@^wViFCw<9Dd_g#(es1lAph57v9m2Kem zsPl(61*qAw_a7(ug_riSThexQMIP&^r_f9tz5nEqk(Hlv=o#rZMNcx8g(jQx@fFbY zH6E9WcVO*?#@p`b-x?9b{Q1}{8gAK{*HL+1 zZPW0}^;q&8BA_qX9Nf9h;$5#@^@v;M?VwPZ+n!My*IUx=ZKD$9{8 zzWHF2b`3Q5H;%sb7Ll`1F5`OI`!cvI__~9N-O2hfVN`9oM?iB*YmXk@oQta$1BaGC zKnd5ejVyajMv$lT=Wb!Co*3}AbvjOp=|5%9cJtP+a49s64K1t|z_N-zm$R2Cln%f6 zwEL%TCon^3Y@9GtxYjm4TjNc2=x>q>e_^E(v}7U$4SIFpxQ*f|l{oLHH0JI8_EwmL zee`X&~+Qc zY!vWJB*ALv5%3K%TFn?*okG=cw(*B%UM`eeAdnw|G*UDR)UQCtxzST9tY_DeHn7Py zER~I9f8sy{U9$a6M^>d=W{AT(UT7;a!D-54k}k4;W7068bM_VKav|zRjz&TydZjlK z)&6OCifbFHeA{(@=8-z zk5||ywi4%dw_%nNS{FcfSq9ZeW?@jaB~4?`qgEXDt$^n!8(QHcyrt#EpPcOqWJcky2E__wjjMD65aG@MNQQFBUDFeRx~fP86=DX z!R=Xam&90%67(aA>LYX)uzbnkg@wcLt)_&f=5?GOir$H6w%U7&?|Hfc`{HU}y41uS zv;_9mD=T;(mUK_V!b|do%r$Q8X5OC>+?^55s_Bl&bE0#UbFuHbUjq!Wq zaaU4oxnovqUQooBrMd&-e&drhiOD>#ggA=7BPpV!o`~QnUU$TK8f9ddti2i`H~4|j zHSQFPHV#Q#CG%-naBD)M>F0uF+${wR_gJG6O#!nUU7bcsoy92zMRlaxckMh_zSA3P zueQvJTXD++>!Md0INdJ<$vSA~_2;aFv3`qfAzeHs@$Hj#yv-VZq*6`oSvxTEgiwOERthlfrW+qxTlGzqT!KCQas#z@M(>K{p2b2o6R*6<4i9(q~=*k-&f_nux{n+%ba?C zaewwM&)YV&Ybhz~%hZJW#80yC+GWzrG?r8!1*r25YxuK&Uf^_Sg;3grdJVsX*d16- z7~)f3I-=It3|uaIuoXAt*N&Z3#)Nqkv4jwjC8#HzaA%-oyVUdMQ^bE9hpVHXyy?qh#k^(RBKpW>T7a~oGr zr&ABjq3iy%RNVPR^>q_A9Z6g-ATLo@Nd{M_hx{?F6HIjv618oA7^)F29rkbXw5+82 zgT2F893`@9szwMsqQyQqmPXb8Qk8GujI3Jlo?cIpAG)j-O^sBOsN1Q8`1b6n9*z09 zKWR?4th!vZaZpCp={Z$pL*KcqW;;;zSVA8#7b}Qu&tJj$-ukapYbubrE zo|DXWN{JF}v5wwjzOyi66#Hd7yUv}`8JOj~$DxT)8;WYifPF7I5w#&J(xG&;|5zCJ zUaEK_5~%~z<@~7$7HuE#yD&&?gk;*&yXYUw=8A3*td%Xdcg2z+>Ni+8J(8Q`H^3m| z2j*z=UetHB53y*pX;b$UOl(rvb2Fh?(ZXbjTceqw#WNvtnXzd+*kyAo{+S_hJeW`m z!I~cFU2p6mX76ogs?Y_kS7IOC#c+mAGs9l-kkXc1A~i{^dx2YlU$?qld6 z@mA-UoOoPR979FMsy#Bi$Z-RloFrd_%|35En+a!n6rMIfEUX+zTNb_Ip1qhjH@GG& z`)w#|n>Uv!aohOt#gze{2lIjXLJBnDwiiYkxp?*;eYn;$~5U)GtOEZ0gUR8c2(o zq2G<}Tw8FMMHuM(K|NRNkYB2BsY9+EbW8cOf?e)M-8)(E$0Tt9GPi=Y{AKXQW%J3E z0UB-dYs1ENIeBb_IL^GVceRbv+e52oqvEegD%$jPa-hq zcU-{qD)ABNW6E}M5OmE5$-WiK+c;~dec#?Jy=YfrAXR)-K0p8 zQm*?n`3AKzovO4mq-oZry&J~|d33A!^duvtCFl%=Q#dEELZi^#a}(ATvTVx1j5qPMtfF0#lh+6z@@@+ z%1rqSt?p_7wNgdLHOx84x|3i?LEl@-Xkn$3!{jIG^-l5F1!Z_r%2$Oa;=E|MDPM=5 z(muU?HV{RoKnAQqo1Fed`Jg2W&<{FfV{2O`U$ra_)o*K z?ZnOlue21VU1cbz%mJA^iG+!}d3}+&hHWL;Vl2MZB`NXaZpx3pwW@f3y-1t;uybR# zT0re*Ge)yuCQUc`S|tMvF217=t9hH1w=9DQeF%NOIgclXwn zell@GE3~Y!A+}36Bm|M1tLO~TUo;q)uQw&$F`h=0+z<+ro`GoBaUb6V8%@iA9JHsq z^>&w}te=py0nCdi2tOLSw7zq3((Nlri8WMFPD#quV95x~LQ|$3F*s6tK~?f}Lc0<> zv`diTt4BvmE^YLe4HJ61mr_djguB%Y$x6g?-=Z!|zd(MOIXk^3lcW>f-TNkdUrCiP zP^-9a-_&?s#QG}Toi+AVZ{lx7RhkI;8#1!!W5yl9+Ko*Wr7NY0R613q;kH6ytMWESnYYL(}=&B}0X9h{<8`Y2zE{V>&co-= z1u9u+eF@*DL(R&k47aAhP^PQjK*$4n6$Fjd38K5$^?& zprw!{r+^2=iyprdk2}ZunDrbEjGe=CZli^-jS}Vqo5BO(*~(}4jM{IC>M^3wAINpo z^fS*PcKc5g%ZWee9wQml>+I;4k&qmsUR2hNR4i8%>Wr^>+$B+4T-g7fk)dMzkQEk- zyGSul!toP-3YB;`Ln?-hVqCrv*Jn9|zvzapXwIHpB^+Cwp-P=4oPP) zOufo65sSa@7|quYtYY>t+CLcQWgn4xr=ZFXjwZ8Q(&vw9Z4;4k%Mb7bDuL$+0^Hn< z&_!g0SbssMh5Oy#MC*(=%vumRgsY$dFY?IP)YW=k?+|#>l<1_FNX6rg`x$ z;~VjKs`S`&nb0)Ns$$`SnsuC8>7i?g&U^2;pJW3V4AI2d(Kd2;loVl$BAwchJE#O} z&?{OZ^S7GL$^_Aq>I6CMgt3ztetaQ|Z&>Tg&76xeq@06fit2L)_Pflg1W_;Ica#Z& zkj?e+xN=9j)~HFoKDM1ygj6cw*m~yK-hSm2XPpmN4C?k?R5gyFNQ$JvOjU5Z>1hdz z`}n(A%i=(=(dl*5FvXDP9O=O=WZnFv{`_}cYmZf0iTtu-^xWwOk9B2!Tcd@V$4!(= z9F#5(sHf`qo4Q{@RA0%mVuMw2?~!y+3Vi3`=f)`5x+hqEE6a}l{|IbfsN0jCdq!Kg~0k>U}6LK2osnQvQi22eKZMsweE7cDn6}6#tot9V3e>fReu`nFN@lN;Z}ni z?nO7?vKS4I$Q#rt(uV=Bfv>Idfg#7`&LrkrBo_i^Y>7M9ibQT{G8Yh6vJY7tYU@oF zVh*Ai-JEyLtwx7aTdjH~#k)eZ+$0OJ0*n`F=fI1{+8QLRgD4#dZ_d)KurZPHg z88>ESdCNISMWe;H=Pq`;u5}!%joEWVj$mf1eoUKkG@>T_q%?6sUyirWX7^kz}PQ>NEtil)qn*FU~KciJbbLDf;PXYAI}P`$sJmVev{8 z{vRhjUa{j9b7oP(U$$!asmGE#svKmF6o0Qi0 zG)|?~(9392GE?a-nhV7{4Cbp3puQ-`Ge-3e% z@^8Jctt|dd6X(xQ6I0$v*E?J*ewZ{EL^x$lh|Wj5Jp-u|_S2+_Rj@I_VlPio^G_wJ z1iW~vNF2UI{!CpyUtjWv;kXr><1$Z59mU3zOX z+YL;+*oQ-0yXhD{r@1N+OuMM(d%sf7(=71Q7l#JBDg?~BoW>juwX6gvQ*;pF+M3Di zn*i-t=tMh+x@&Gb@$x?1`OmgL+BO@j+{v;R=(bc}A0x*=GblHd=C8lx%s9qUg=1z6F1y3L0TrcsaIAZj8Kt$w2*u_Hbg8pJ( zaHMD(ccn*qQ0zogGf=amB}oFeBCrQ@i6s%;;(1B7&iE3#ewkocV8z_h@`=HI-*c0y zrT26S5ZYa38CPPgjIXkZCTgwKA&=P0l({F;k1YzTB9spqybN$(egFt+w;9$%sq7-V zi(Iv-3-%{?f>zm$t!4#Im@QG#oUZKTs>DaMCYUy{gva?KF?$)F50NS>Zn)mUs(1@;x}TUY7lGHm`kr*)q{*H$<450;DQ5bfoW z#G2+Bl@Hp8G3qQ^rj7e(mY(Mo%JMZ)Gq+Kp+ElQlQyG@$nEC71dyeNh{*30n$G@zK z;DQX(XLVuAi=G&|fAUe>yZq`aWy@O_RwgD;oguHa@B+%f*+3MJLpIs@b`eL!WWAjl z#iQ*N>N~I7X;X_5z&BelBD@;fkk#!vZ-Tdp{mFZt;*X+qo)G(&P;^STdKeXv1dzrv zU2b6d+|s=pj~dYlAoJYQuw;}V9p_O^&EtWnoraNLYP~4@Q>XY8<;x{fRl0^$r#Kqv zNZE+fFLLJ;4MI%n5U0H-=MuMGt#bE3AI&!7rAfV1+K+gr&^h43dpuW zG!w)>*Ec>AyOLCTtE!rb!7!oPuQ{zJKLaG>NjUq(fxArqJsm2T5Ey7{!7&k`vCB5l zBk1`!aTMQ^k!{b>&-87D_`zemKJY@{bCF0Yj;BY|g&j|+UHNq`9fW}>qxG|s z8S*4!kJ4^GF~ny!DRGZ@D2z;bo4Td#Kw6o&zFHoXcc-yJlu^FYGLAjO<0q{~`|XZh zcmg>LM0ojh+SqIju?*xs@I4i&2(`au3VFcb+gso*Xn6GZzse)gmL;&MeK5_W+;ep^ z)uYUY?o9;(}R};IYhVfV<_&Vnh*Yv?w z@fZAwSuwTPRQ9Lo4J5;4NuI=$q>iT2w`L+`xk_`U~RPHW@Qf1LZH)I^bF`uWWX zIK)zw>7?<1F1pUdq@MQKOOL|XUYiI7n}E2}(o7`|3{W9$hKjDvb1p9jtvkI86)|G% zCav(_WMqZJQXzsQ%uaH=t?CKqJ-Tx$`xJ3h8!V6Y0R@cDSw_9y)9!pUsewd4w+WNI zT+Q=j`r5H9ZIE%%qmJQ9ySr;pbzMZJl`|pq#4=itDU$T^k>YNaS^Vb8QK?=~MrlcP zFsVcAtj{#fc4Pkw&S4Cls)>Tjc^M2^Lk61Eudpu<$P>7R8q@y}u32Zuc>mmsXJ@Z5 z%j*Bt^&N0Mf8YP_#_RRI@AguP6cs`Pk;u$U2$4yL}|9_81562nLbMCq4-q&(ZDQ<~#%id`|C~MKJaAwc8H#!HVUfj84 zu&Cu)rsSUlJpD_wf)<9WL;9T!+R zrUg6+SYUiA;ZEB_3r89RPqj;q69>6{*)siMQl*d;X?tx=(hS`@%ifr5S2z{=#Z>dy zuFRS_$ES3CcJYGs?17#SCA%#r&RG|pxNMEr5#46$+nZfEF*talsgo#Ed6b#nGUviH zQ+-*{oWRYU?VXGlJlB7(o_6k(&eovtl|$#npW0H@u49DdH}3+=tUWVdZ=ChH{}EB= z#`3l|?_PfHe0e~(dAlF116AGFF>m~6Rp?turx4pae1zx8f_r^benyYI+Mm8%aTSiyhRN6|(J`NtAFz|Dc6G`@ z>;!AhFXjK(am+sT$_A7=Izg~whd(2gg&Nj8#{jaId5<49-MK&-5~BJHb3NY=qSpFMfj$5ro1=ErA`9$1|f=>cEUMjbt1m7=~H z1Ze6&^n7{tB-wx_ki&6~MAP#32b-2XDea>-dvv_W6<_$t%XXe-AQ zt3))p-0Q( z(KK4EZP-q@z~w*t^A2+v~R1 zjA#4Ic)YrIuR$qKRurx1Qjw}>GQG`$A7?u{B~Lo>Jg}(L>weSLGT+sEa@0C_j87ZC z$>YV_Ps2tG^d5AoZboRI{Y>UF7!*MY*BmYt^i9WnD8=MmFRbIhFn zd)k-##+!{R+!xa2zl)2OPP-RjlxJFdesDLZJ1sidZapa4 z>;7GV8$A1E3>jPLm3$-V)%@K(bwSAngL`f-AgblqKGtEgz4Fo#hN z6NJ0W!mDJ{su*>Nc|x>clruY0fW~2D^)HPU(nLzNi503D&tRXBq(*sX(*=JGN;#YscIr{; z?oA;}n^K|Ag(qyx3ttHB*_w}iCA4D}*S-jubmPcbT`vSMP-uXjr78DqdmGchtm5ES+Niwr<~H6B#MuzOK;Ui7L+55Y^enxKdl( z#}p5DI^407^6hDw5b>K4*tYbBbCjF0~PG} z1=>Dzv=l|A*uA}&%BU(Uak>%B!-&D6IUDnmv7#*tJK0_I*Qe5!-eMfvU!NB4kVZh` zz8CtqPdT*A1AHN;cCnbuW^{L;=*f%~g2f0nqfsGZHk)PV2yr!|u1AUd3Xl;k>afYX zxLd4dX*il7&Q)cOQ$@r=?QmFBV3ci!sLUw)tOlxAHc<3JaVvXgMFvd8Alx@gbiir9 zNfVx9;z<^j%W-iM8&XPQe4b zO;fs_mFSv^{>QvQalIlg-YvGlTJBPmQ=~23$h?f#m7Zkj&~GZ;#YUIiOxl~({1;QH zjTMcd?QrQ4wjwIVN*6H;w~11Jbt)~GBlT)QDTfWxg=~eT#7GaY;&9t1?aXQ{BvYEg zkh|qbwb|%gPDss_HI~38<`-5P{=0=lvMCG)j}==)Ysm~S9KP1extu3OCfY=0u(FxS zWw^g^hQ1-)aB!Z~Hb?8B6z-ounDg$j)I)(Hbv>Ki1&(`5RNx)_PZ+eVj;u{i>Qia| zepDRv4mN$riIo!esbyj8nu>D zwX61Myb=XTLq;4jE?92y{}Ns`Z?V6tpPScLA~!NN-HM%n#X6;*cM*r^ItV)QhyE#1@N?6KN!d z=Pg3RD3QAejiVy{#b`8Xn~CQyMnlQ`;FF8dSW4*nqrsGz;*VS?k>-zF2@$;nxlsnd zG{b&NP)~}LwFHf#gmfvINQs$C0i8I`U5chqqWLm3gA!|(p-Gf@x(s7F$lP*@8| zC&5o!%gxWPMRO^~W*x_gSjWxZujBb~UC%`s>p5VP|G4?G|Ikco{`fzRU$loKmL(IU!uABy}bF*l4m zy%UDKD5qaI@}opfI1gTbGY@{rW*)}v%{+Mf2tLvs5nQ=00!^UiW47>d2McZ$*nK(LRcgBDR6h+{Oc2w~dGTej87M=XO58JKIqJH6Iy`)==VZ zH0O-MXes3sU=&1&5izKM5-oNhciL>PXLYNWH*jqUYJ#J7z=9x?aBByeL|gRTs@oWd z70$uk&#;}S2bG2HL=&iCXylE;Vyy5543&0qL#JJ65*4zhjJ`)en70c#Qp=ya_|%Tw z%}X}FfoL1cOD!yxr>QCyxzi9xheiCZ1VWe+$GybGaiF?5J~?CKx!I9;K5x1S$dg9G z+9Q03<2e~EdP)LQI$y^wpjK)w)){l@1bq;aih(l-`6)wZ0W^KcCmMQU*aDz!HuSJK9u`%FMF3Y+4p~ ztbHoG1GBr;Ak#X+9nU+$CyI3vq}h9Xgd-SdLm`p@24q9E5#n(+)E^=GABBn}#Qp|C zJjRthk3m5bQT{QWbAue7P2U_ejV6lp3%rVHqTc23M72MT+~_!s7r1O>8IC=U94ITt zcX>KveF7Fmw>`nt4ZSWbXR^H~xUAv?AG)l6RwOInktcc1x18h!#+nAw{YNR67l2bP zk2E%y$Nss27%U^ zzrk~JW^mlj%WNSGD@G2qLXMl?>dJYEz@r9_i+NIRbP#M- zDX&ZT3=g=;lM;KASK`;3JgnijIOpIk9-qQ(t~~xW-&bh&Ji4zG-sW}j{$Th=He(id zxHr!`Xfh4mZN=Idd|f}h!$UW`%Rznb@|X&ML)BTgJUX4d?{Tb^_xN^KHM-{#=I4Eb z%(|2Zx}lU~J}O01wBzvl-K5C}8{s0ax zL*~$2SXmu!zK_&svSW#8LlP5J+(#ya8(jv>x@5w%feRh<<7;1o)J#EQcQby0X9n~_ zKM7ACy}&`kpTyv=nMB{kRK5qBMAEfE1^!M9RysjZ|NpTT6W?p{@RJ9~3~QAmV;ZJy zIdDJbGpP-FTq0|g7?fltn9-shEd@KER|L;E$+ zrZafj1Jp#ZbKxHaDQP*=lma&PJdsFjw>eCM%HkZI#9eIGGB2)FR-~izj z0MH9DZb1c`OI$;^<7A9$^@yj=cr)EPJQ5o$uCZTunt{qy9a4bo()Pah$D8to4P z;HS;F@O?m^0yOR4FZeU$ehfVDTFU{}DQyPt0HI~gpFfGg z@7gle*-v4LNm)03mw+YpN0An6d!`B>DRgm21S|u1#{KI@_Y=tL@94_(3#>pt?imb-JZGmpg8{8}AR;qd{R|l(;+1^tptsZtQP{Q; z*7Bg|5I>Qa?>RGj1q?F}7QOsX(|agm?dru-!WxgcC_F$m!ZrpV-0N?t74-!AhKJF6{?XHe((lfDSN-+lQ(imLUt5v5(k_9 zdmUM|;g7xvjrBL6D9n$pM%MWCdcg?C!?lPCeBT1Re+*O4eT!PtEHu9Lmq-T7#s73S zQDyJ1CRBrMm%W5xhf}IyvxTwP4Yk;#wHa2yHMqLDGe7A+>~IisN1gs`ywfFNSg=vik5xq>U}#bL>}hi*%ksGHQ+Cb*EfHCVnFNCef;* zfQw%NT=F}l){-RAWJuwnIq)sjRQKQbH!6xa^F2K4k=(s|54*jiD&<(>oO(eE_xi>m zBu!?yX2Ev(80JDg1;@3hff+9T1ikWieL(cxI?nt6V8?X-mf0dvihqCLwW9tJ6t?L9 ztuXo{H=avmQBD7rr4ts3vXBrT4F8tFcNZCM{)q#({{#x%jsI5gB`jhbL5RmK8fEmO z39csWA1yiCM_*K-tB)pc*jh(5(jR>hY;5ug-(k%SG|WU*d@!7+%G1}!aTHu}ZQyRF zz1$4xcjN}477*}TSl=|LAD_W{rX82THy#7(c>jcJ-=>4(&i|A0x~^PzL3>dRci+k# zXIgC7Xlx{rD0TVQagqZyfV%#I45?4mui#VNjk8w|7PTA8<)^3Q#!U#Eyis?O8-Sgs zh)dFi7Wke!7##hIT2iq41Z?*7MwtQbP{#+?qYh+`0^rWbTeQJtG8rq$#?MdxW;G~? z+q$(=Z{F8(4qioAI!3;4?o=#M;54J*{DU_#0fgyti@9 zij9!Bp$*VcQzyRlfZ6qgCDKi9yd$F_?o_cA9{e4d(V=>O2WYg5vk!lVJ0Vh6C4{{x zp0j^Ni8^@dcRnpY+n3gygE_QQgRg*c@ZNj5f!_~gO6NRH^HYxS0LP0`sjMA-mmrGNF%4?`Pmn#zp|bAVPw-2?8Nz*if^s|Kg@<8H zHvPpzoqT%49rDd>GK3)Sz9yF&Ec?aR=;mL5^Er>R9|4<=z;?Y-F@YHTKM+6jx$eN< z9AeUMfKWQe+3$Dvmq@z9t-buMnaTzH_%|BBQnhh}n>x(eQ_ zwoZ}CTEkWDZ`ouekijp}VqO;1iKdNq#YE;TaG9R6jNQ37Cq&Oh6ZgibaWGhq~Wlb;=WgSdl?b&?~ zTk2~EPKH9JUE~~T;1VQbzc3E35M`aIn@ka)QZ+c#XHmw|t1Sigc`eSqAxcF&Q7U8m zTOg6S>om$NX=J!gDr=#n+Jy6aBUx9akNQ%!W9&q-rZf+YA9nwJ_*F2J;*ksBp1+SK zc>9F_jO-;XWZ>5@T%C5 z+|80t^usHDg-Kz3MZ=H$<44+CoS-cmMiFWWf_4o@aD?ykEs1gCmwAa~fZR-F+9Fc@ z);LQ?W=j1>ePMmF_D>J1Ka-ZwvAWXY+UHE*@ULR3|vzcY?m9QE7hKuNUIfD&O z++d@gOap7`!90=CJL-YsX9F8$rj(sR*sI2KHhj)k!F$7z4)r1Ty*(4~pGrtN;K2 delta 26603 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 JXOO0{{{s@0iq!xB diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java index d080ec18f..527e7369b 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java @@ -55,6 +55,7 @@ import org.aspectj.apache.bcel.generic.PUTSTATIC; import org.aspectj.apache.bcel.generic.RET; import org.aspectj.apache.bcel.generic.ReturnInstruction; import org.aspectj.apache.bcel.generic.Select; +import org.aspectj.apache.bcel.generic.Tag; import org.aspectj.apache.bcel.generic.Type; import org.aspectj.apache.bcel.generic.annotation.AnnotationGen; import org.aspectj.bridge.IMessage; @@ -769,7 +770,7 @@ class BcelClassWeaver implements IClassWeaver { 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()); + MethodGen myGen = new MethodGen(oldMethod,clazz.getClassName(),clazz.getConstantPoolGen(),false);// dont use tags, they won't get repaired like for woven methods. myGen.addAnnotation(ag); Method newMethod = myGen.getMethod(); mg.addAnnotation(decaM.getAnnotationX()); diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java index a5dd60910..b6b661154 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java @@ -43,6 +43,7 @@ import org.aspectj.apache.bcel.generic.InstructionList; import org.aspectj.apache.bcel.generic.InstructionTargeter; import org.aspectj.apache.bcel.generic.InvokeInstruction; import org.aspectj.apache.bcel.generic.LoadInstruction; +import org.aspectj.apache.bcel.generic.LocalVariableTag; import org.aspectj.apache.bcel.generic.MULTIANEWARRAY; import org.aspectj.apache.bcel.generic.NEW; import org.aspectj.apache.bcel.generic.ObjectType; @@ -1344,12 +1345,13 @@ public class BcelShadow extends Shadow { */ public UnresolvedType ensureTargetTypeIsCorrect(UnresolvedType tx) { - - if (tx.equals(ResolvedType.OBJECT) && getKind() == MethodCall && - getSignature().getReturnType().equals(ResolvedType.OBJECT) && - getSignature().getArity()==0 && - getSignature().getName().charAt(0) == 'c' && - getSignature().getName().equals("clone")) { + Member msig = getSignature(); + if (msig.getArity()==0 && + getKind() == MethodCall && + msig.getName().charAt(0) == 'c' && + tx.equals(ResolvedType.OBJECT) && + msig.getReturnType().equals(ResolvedType.OBJECT) && + msig.getName().equals("clone")) { // Lets go back through the code from the start of the shadow InstructionHandle searchPtr = range.getStart().getPrev(); @@ -1363,7 +1365,7 @@ public class BcelShadow extends Shadow { LoadInstruction li = (LoadInstruction)searchPtr.getInstruction(); li.getIndex(); LocalVariableTag lvt = LazyMethodGen.getLocalVariableTag(searchPtr,li.getIndex()); - if (lvt!=null) return lvt.getType(); + if (lvt!=null) return UnresolvedType.forSignature(lvt.getType()); } // A field access instruction may tell us the real type of what the clone() call is on if (searchPtr.getInstruction() instanceof FieldInstruction) { diff --git a/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java b/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java index 809d41225..043537de1 100644 --- a/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java +++ b/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java @@ -24,6 +24,7 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.Properties; import java.util.Set; import java.util.Stack; @@ -44,15 +45,19 @@ import org.aspectj.apache.bcel.generic.InstructionHandle; import org.aspectj.apache.bcel.generic.InstructionList; import org.aspectj.apache.bcel.generic.InstructionTargeter; import org.aspectj.apache.bcel.generic.LineNumberGen; +import org.aspectj.apache.bcel.generic.LineNumberTag; import org.aspectj.apache.bcel.generic.LocalVariableGen; import org.aspectj.apache.bcel.generic.LocalVariableInstruction; +import org.aspectj.apache.bcel.generic.LocalVariableTag; import org.aspectj.apache.bcel.generic.MethodGen; import org.aspectj.apache.bcel.generic.ObjectType; import org.aspectj.apache.bcel.generic.Select; +import org.aspectj.apache.bcel.generic.Tag; 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.MessageUtil; import org.aspectj.weaver.AjAttribute; import org.aspectj.weaver.AnnotationX; import org.aspectj.weaver.BCException; @@ -94,6 +99,27 @@ public final class LazyMethodGen { private BcelMethod memberView; private AjAttribute.EffectiveSignatureAttribute effectiveSignature; int highestLineNumber = 0; + + + /* + * This option specifies whether we let the BCEL classes create LineNumberGens and LocalVariableGens + * or if we make it create LineNumberTags and LocalVariableTags. Up until 1.5.1 we always created + * Gens - then on return from the MethodGen ctor we took them apart, reprocessed them all and + * created Tags. (see unpackLocals/unpackLineNumbers). As we have our own copy of Bcel, why not create + * the right thing straightaway? So setting this to true will call the MethodGen ctor() in such + * a way that it creates Tags - removing the need for unpackLocals/unpackLineNumbers - HOWEVER see + * the ensureAllLineNumberSetup() method for some other relevant info. + * + * Whats the difference between a Tag and a Gen? A Tag is more lightweight, it doesn't know which + * instructions it targets, it relies on the instructions targetting *it* - this reduces the amount + * of targeter manipulation we have to do. + * + * Because this *could* go wrong - it passes all our tests, but you never know, the option: + * -Xset:optimizeWithTags=false + * will turn it *OFF* + */ + public static boolean avoidUseOfBcelGenObjects = true; + public static boolean checkedXsetOption = false; /** This is nonnull if this method is the result of an "inlining". We currently * copy methods into other classes for around advice. We add this field so @@ -248,9 +274,20 @@ public final class LazyMethodGen { private void initialize() { if (returnType != null) return; + // Check whether we need to configure the optimization + if (!checkedXsetOption) { + Properties p = enclosingClass.getWorld().getExtraConfiguration(); + if (p!=null) { + avoidUseOfBcelGenObjects = Boolean.parseBoolean(p.getProperty("optimizeWithTags","true")); + if (!avoidUseOfBcelGenObjects) + enclosingClass.getWorld().getMessageHandler().handleMessage(MessageUtil.info("[optimizeWithTags=false] Disabling optimization to use Tags rather than Gens")); + } + checkedXsetOption=true; + } + //System.err.println("initializing: " + getName() + ", " + enclosingClass.getName() + ", " + returnType + ", " + savedMethod); - MethodGen gen = new MethodGen(savedMethod, enclosingClass.getName(), enclosingClass.getConstantPoolGen()); + MethodGen gen = new MethodGen(savedMethod, enclosingClass.getName(), enclosingClass.getConstantPoolGen(),avoidUseOfBcelGenObjects); this.returnType = gen.getReturnType(); this.argumentTypes = gen.getArgumentTypes(); @@ -273,10 +310,16 @@ public final class LazyMethodGen { } else { //body = new InstructionList(savedMethod.getCode().getCode()); body = gen.getInstructionList(); - + unpackHandlers(gen); - unpackLineNumbers(gen); - unpackLocals(gen); + + if (avoidUseOfBcelGenObjects) { + ensureAllLineNumberSetup(gen); + highestLineNumber = gen.getHighestlinenumber(); + } else { + unpackLineNumbers(gen); + unpackLocals(gen); + } } assertGoodBody(); @@ -363,6 +406,33 @@ public final class LazyMethodGen { gen.removeLineNumbers(); } + /** + * On entry to this method we have a method whose instruction stream contains a few instructions + * that have line numbers assigned to them (LineNumberTags). The aim is to ensure every instruction + * has the right line number. This is necessary because some of them may be extracted out into other + * methods - and it'd be useful for them to maintain the source line number for debugging. + */ + private void ensureAllLineNumberSetup(MethodGen gen) { + LineNumberTag lr = null; + boolean skip = false; + for (InstructionHandle ih = body.getStart(); ih != null; ih = ih.getNext()) { + InstructionTargeter[] targeters = ih.getTargeters(); + skip = false; + if (targeters != null) { + for (int i = targeters.length - 1; i >= 0; i--) { + InstructionTargeter targeter = targeters[i]; + if (targeter instanceof LineNumberTag) { + lr = (LineNumberTag) targeter; + skip=true; + } + } + } + if (lr != null && !skip) { + ih.addTargeter(lr); + } + } + } + private void unpackLocals(MethodGen gen) { Set locals = new HashSet(); for (InstructionHandle ih = body.getStart(); ih != null; ih = ih.getNext()) { @@ -373,7 +443,7 @@ public final class LazyMethodGen { InstructionTargeter targeter = targeters[i]; if (targeter instanceof LocalVariableGen) { LocalVariableGen lng = (LocalVariableGen) targeter; - LocalVariableTag lr = new LocalVariableTag(BcelWorld.fromBcel(lng.getType()), lng.getName(), lng.getIndex(), lng.getStart().getPosition()); + LocalVariableTag lr = new LocalVariableTag(lng.getType().getSignature()/*BcelWorld.fromBcel(lng.getType())*/, lng.getName(), lng.getIndex(), lng.getStart().getPosition()); if (lng.getStart() == ih) { locals.add(lr); } else { @@ -1006,9 +1076,13 @@ public final class LazyMethodGen { continue; } slots.add(new Integer(tag.getSlot())); - - gen.addLocalVariable(tag.getName(), - BcelWorld.makeBcelType(tag.getType()), + Type t = tag.getRealType(); + if (t==null) { + t = BcelWorld.makeBcelType(UnresolvedType.forSignature(tag.getType())); + } + gen.addLocalVariable( + tag.getName(), + t, tag.getSlot(),(InstructionHandle) start,(InstructionHandle) lvpos.end); } } diff --git a/weaver/src/org/aspectj/weaver/bcel/Range.java b/weaver/src/org/aspectj/weaver/bcel/Range.java index 60702912b..f32335dd4 100644 --- a/weaver/src/org/aspectj/weaver/bcel/Range.java +++ b/weaver/src/org/aspectj/weaver/bcel/Range.java @@ -197,6 +197,7 @@ abstract class Range implements InstructionTargeter { // assert isRangeHandle(ih) Range ret = null; InstructionTargeter[] targeters = ih.getTargeters(); + if (targeters!=null) { for (int i = targeters.length - 1; i >= 0; i--) { if (targeters[i] instanceof Range) { Range r = (Range) targeters[i]; @@ -205,7 +206,10 @@ abstract class Range implements InstructionTargeter { ret = (Range) targeters[i]; } } - if (ret == null) throw new BCException("shouldn't happen"); + } + if (ret == null) { + throw new BCException("shouldn't happen"); + } return ret; } diff --git a/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java b/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java index 7632c3e16..cf46cbf68 100644 --- a/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java +++ b/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java @@ -21,6 +21,7 @@ import org.aspectj.apache.bcel.generic.InstructionHandle; import org.aspectj.apache.bcel.generic.InstructionList; import org.aspectj.apache.bcel.generic.InstructionTargeter; import org.aspectj.apache.bcel.generic.LocalVariableInstruction; +import org.aspectj.apache.bcel.generic.LocalVariableTag; import org.aspectj.apache.bcel.generic.RET; import org.aspectj.apache.bcel.generic.Select; import org.aspectj.apache.bcel.generic.TargetLostException; diff --git a/weaver/src/org/aspectj/weaver/bcel/Utility.java b/weaver/src/org/aspectj/weaver/bcel/Utility.java index 7eec5ef41..79571fcf7 100644 --- a/weaver/src/org/aspectj/weaver/bcel/Utility.java +++ b/weaver/src/org/aspectj/weaver/bcel/Utility.java @@ -44,6 +44,7 @@ import org.aspectj.apache.bcel.generic.InstructionHandle; import org.aspectj.apache.bcel.generic.InstructionList; import org.aspectj.apache.bcel.generic.InstructionTargeter; import org.aspectj.apache.bcel.generic.LDC; +import org.aspectj.apache.bcel.generic.LineNumberTag; import org.aspectj.apache.bcel.generic.ObjectType; import org.aspectj.apache.bcel.generic.ReferenceType; import org.aspectj.apache.bcel.generic.SIPUSH; @@ -655,9 +656,8 @@ public class Utility { // } // return getSourceLine(ih.getNext()); // } - - public static int getSourceLine(InstructionHandle ih) { + public static int getSourceLine(InstructionHandle ih) {//,boolean goforwards) { int lookahead=0; // arbitrary rule that we will never lookahead more than 100 instructions for a line # while (lookahead++ < 100) { @@ -672,11 +672,16 @@ public class Utility { } } } - ih = ih.getNext(); +// if (goforwards) ih=ih.getNext(); else + ih=ih.getPrev(); } //System.err.println("no line information available for: " + ih); return -1; } + +// public static int getSourceLine(InstructionHandle ih) { +// return getSourceLine(ih,false); +// } // assumes that there is no already extant source line tag. Otherwise we'll have to be better. public static void setSourceLine(InstructionHandle ih, int lineNumber) { -- 2.39.5