[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] [BUG?] java.lang.VerifyError with @AspectJannotation (but with a certain call to print, it works!?)

Bug filed:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=288712
On Thu, Sep 3, 2009 at 5:34 PM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
Always raise VerifyErrors as bugs. They are more common with
annotation style than code style because of the reduced amount of
checking we can perform at compile/weave time. And annotation style is
still much younger in terms of maturity than code style.

Andy

2009/8/31 Andrew Eisenberg <andrew@xxxxxxxxxxxx>:
> Hi there,
>
> It would be best if you could raise a bug for this.  What you are
> seeing is not the intended behavior.  Thanks.
>
> Andy is away right now until Thursday, but he will be able to look at
> this when he returns.
>
> --a
>
> On Mon, Aug 31, 2009 at 5:21 AM, <jeanlouis.pasturel@xxxxxxxxxxxxxxxxxx> wrote:
>> Perhaps there is confusion with the reserved Aspectj word thisJoinPoint used
>> in jour advice @Around.
>>
>> I don’t know it is a bug ; I let AspectJ gurus answer when they will come
>> back from holidays ;-)
>>
>>
>>
>> Cordialement / Best regards
>>
>>
>>
>> Jean-Louis Pasturel
>>
>> ________________________________
>>
>> De : aspectj-users-bounces@xxxxxxxxxxx
>> [mailto:aspectj-users-bounces@xxxxxxxxxxx] De la part de João Gonçalves
>> Envoyé : lundi 31 août 2009 14:11
>> À : aspectj-users@xxxxxxxxxxx
>> Objet : Re: [aspectj-users] [BUG?] java.lang.VerifyError with
>> @AspectJannotation (but with a certain call to print, it works!?)
>>
>>
>>
>> Execution solves the problem!!
>>
>> Many thanks.
>>
>> But, still, shouldn't this be considered a bug? I mean, if I use the
>> "traditional" aspect notation, everything goes as planned. And the fact that
>> adding the prints, solves the problem is also weird...
>>
>> Should I resport a bug?
>>
>> Thanks.
>>
>> On Mon, Aug 31, 2009 at 1:01 PM, <jeanlouis.pasturel@xxxxxxxxxxxxxxxxxx>
>> wrote:
>>
>> Sorry João,
>>
>> I have not read your entire post correctly.
>>
>> Did you try with an “execution” pointcut ( not a call) ?
>>
>>
>>
>> Cordialement / Best regards
>>
>>
>>
>> Jean-Louis Pasturel
>>
>> ________________________________
>>
>> De : aspectj-users-bounces@xxxxxxxxxxx
>> [mailto:aspectj-users-bounces@xxxxxxxxxxx] De la part de João Gonçalves
>> Envoyé : lundi 31 août 2009 12:58
>>
>> À : aspectj-users@xxxxxxxxxxx
>>
>> Objet : Re: [aspectj-users] [BUG?] java.lang.VerifyError with
>> @AspectJannotation (but with a certain call to print, it works!?)
>>
>>
>>
>> Unfortunately, that's not the problem. With or without the blank the same
>> happens.
>>
>> Regards.
>>
>>
>>
>> On Mon, Aug 31, 2009 at 9:03 AM, <jeanlouis.pasturel@xxxxxxxxxxxxxxxxxx>
>> wrote:
>>
>> Perhaps a blank misses in the annoted pointcut :
>>
>>  @Pointcut("call(public void figures.FigureElement+.move(int, int))"
>>
>>   +"<blank>&& target(fe) && args(dx, dy)")
>>
>>
>>
>> Cordialement / Best regards
>>
>>
>>
>> Jean-Louis Pasturel
>>
>>
>>
>> ________________________________
>>
>> De : aspectj-users-bounces@xxxxxxxxxxx
>> [mailto:aspectj-users-bounces@xxxxxxxxxxx] De la part de João Gonçalves
>> Envoyé : lundi 31 août 2009 09:45
>> À : aspectj-users@xxxxxxxxxxx
>> Objet : [aspectj-users] [BUG?] java.lang.VerifyError with @AspectJannotation
>> (but with a certain call to print, it works!?)
>>
>>
>>
>> Hi,
>>
>> I'm using Eclipse 3.4.1, AspectJ 1.6.5 and AJDT 2.0.0.
>>
>> I've created a very simple test scenario that utilizes @AspectJ. When
>> running a main method in a class or when running a Junit test, I get the
>> following error:
>>
>>
>>
>> Exception in thread "main" java.lang.VerifyError: (class: figures/Line,
>> method: move_aroundBody3$advice signature:
>> (Lfigures/Line;Lfigures/Point;IILorg/aspectj/lang/JoinPoint;Lanswers/Answer2h;Lorg/aspectj/lang/ProceedingJoinPoint;Lfigures/FigureElement;II)V)
>> Incompatible argument to function
>>  at MainTest.main(MainTest.java:24)
>>
>> Here's the aspect that is causing the error
>>
>> ===============================================================
>>
>> Answer2h.java
>>
>> ===============================================================
>>
>> package answers;
>>
>> import org.aspectj.lang.ProceedingJoinPoint;
>> import org.aspectj.lang.annotation.*;
>> import figures.*;
>> import java.awt.Rectangle;
>>
>> @Aspect
>> public class Answer2h {
>>  @Pointcut("call(public void figures.FigureElement+.move(int, int))"
>>   +"&& target(fe) && args(dx, dy)")
>>  void movingFigureElement(FigureElement fe, int dx, int dy) {}
>>
>>  @Around("movingFigureElement(fe, dx, dy)")
>>  public void checkIfBoundsMovedSame(ProceedingJoinPoint thisJoinPoint,
>>   FigureElement fe, int dx, int dy) throws Throwable {
>>   Rectangle rectangleBefore = new Rectangle(fe.getBounds());
>>   thisJoinPoint.proceed(new Object[]{fe, dx, dy});
>>   rectangleBefore.translate(dx, dy);
>>   if(!rectangleBefore.equals(fe.getBounds()))
>>   throw new IllegalStateException("move() invariant violation");
>>  }
>> }
>> ===============================================================
>>
>> However, strangely, when I had the following 3 lines to my aspect (I was
>> just doing debug), everything works normally:
>>
>> ===============================================================
>>
>> Answer2h.java (with 3 more lines)
>>
>> ===============================================================
>>
>> package answers;
>>
>> import org.aspectj.lang.ProceedingJoinPoint;
>> import org.aspectj.lang.annotation.*;
>> import figures.*;
>> import java.awt.Rectangle;
>>
>> @Aspect
>> public class Answer2h {
>>  @Pointcut("call(public void figures.FigureElement+.move(int, int))"
>>   +"&& target(fe) && args(dx, dy)")
>>  void movingFigureElement(FigureElement fe, int dx, int dy) {}
>>
>>  @Around("movingFigureElement(fe, dx, dy)")
>>  public void checkIfBoundsMovedSame(ProceedingJoinPoint thisJoinPoint,
>>   FigureElement fe, int dx, int dy) throws Throwable {
>>   Rectangle rectangleBefore = new Rectangle(fe.getBounds());
>>
>>   for(Object o: thisJoinPoint.getArgs()) {
>>   System.out.print(o+" ");
>>   }
>>
>>   thisJoinPoint.proceed(new Object[]{fe, dx, dy});
>>   rectangleBefore.translate(dx, dy);
>>   if(!rectangleBefore.equals(fe.getBounds()))
>>   throw new IllegalStateException("move() invariant violation");
>>  }
>> }
>> ===============================================================
>>
>> ????
>>
>> If I use any other print (and comment the privous print), the code continues
>> giving the same error...
>>
>> Examples (that don't work):
>>
>> // System.out.println("ENTERED");
>> // System.out.println("Kind: "+thisJoinPoint.getKind());
>> // System.out.println("Signature: "+thisJoinPoint.getSignature());
>> // System.out.println("This: "+thisJoinPoint.getThis());
>> // System.out.println("Target: "+thisJoinPoint.getTarget());
>>
>> Another interesting thing (that makes me believe it's some kind of bug).
>> The Answer2h.java is equivalent to this one:
>>
>> ===============================================================
>>
>> Answer2h.aj
>>
>> ===============================================================
>>
>>  package answers;
>>
>> import figures.*;
>> import java.awt.Rectangle;
>>
>> public aspect Answer2h {
>>  pointcut movingFigureElement(FigureElement figureElement, int dx, int dy):
>>   call(public void figures.FigureElement+.move(int, int)) &&
>>   target(figureElement) &&
>>   args(dx, dy);
>>
>>  void around(FigureElement figureElement, int dx, int dy):
>>   movingFigureElement(figureElement, dx, dy) {
>>   Rectangle rectangleBefore =
>>   new Rectangle(figureElement.getBounds());
>>   proceed(figureElement, dx, dy);
>>   rectangleBefore.translate(dx, dy);
>>   if(!rectangleBefore.equals(figureElement.getBounds()))
>>   throw new IllegalStateException("move() invariant violation"); }
>> }
>> ===============================================================
>>
>> But this latter works!!
>>
>> Can anyone tell me how to fix this?
>>
>> Thanks.
>>
>> Here's the MainTest.java code (not sure if it helps):
>>
>> ===============================================================
>>
>> MainTest.java
>>
>> ===============================================================
>>
>> import figures.Box;
>> import figures.FigureElement;
>> import figures.Group;
>> import figures.Line;
>> import figures.Point;
>> import figures.SlothfulPoint;
>>
>>
>> public class MainTest {
>>
>>  /**
>>   * @param args
>>   */
>>  public static void main(String[] args) {
>>   Box bb;
>>   Point p1;
>>   Point p2;
>>   Line l1;
>>   SlothfulPoint sloth1;
>>   Group g;
>>
>>   p1 = new Point(10, 100);
>>   p2 = new Point(20, 200);
>>   l1 = new Line(p1, p2); // line of the error
>>   bb = new Box(5, 5, 10, 10);
>>   sloth1 = new SlothfulPoint(0, 0);
>>   g = new Group(p1);
>>
>>   FigureElement fe = new SlothfulPoint(10, 10);
>>   try {
>>   fe.move(10, 10);
>>   System.out.println("should have thrown IllegalStateException");
>>   } catch (IllegalStateException e) { e.printStackTrace(); }
>>
>>   p1.move(30, 45);
>>   p2.move(10, 33);
>>  }
>>
>> }
>>
>> ===============================================================
>>
>> P.S.:
>>
>> When I use the MainTest.java to lauch the example, inside Answer2h.java I
>> have to use this call to proceed:
>>
>> thisJoinPoint.proceed(new Object[]{fe, dx, dy});
>>
>> But, when I use the JUnit, the test oly runs if I use :
>>
>> thisJoinPoint.proceed(new Object[]{fe, fe, dx, dy});
>>
>> Why? Shouldn't the call be the same? And shouldn't the latter be the correct
>> one ({target + 3 parameters})?
>>
>> Regards.
>>
>> *********************************
>> This message and any attachments (the "message") are confidential and
>> intended solely for the addressees.
>> Any unauthorised use or dissemination is prohibited.
>> Messages are susceptible to alteration.
>> France Telecom Group shall not be liable for the message if altered, changed
>> or falsified.
>> If you are not the intended addressee of this message, please cancel it
>> immediately and inform the sender.
>> ********************************
>>
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>
>>
>>
>> *********************************
>> This message and any attachments (the "message") are confidential and
>> intended solely for the addressees.
>> Any unauthorised use or dissemination is prohibited.
>> Messages are susceptible to alteration.
>> France Telecom Group shall not be liable for the message if altered, changed
>> or falsified.
>> If you are not the intended addressee of this message, please cancel it
>> immediately and inform the sender.
>> ********************************
>>
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>
>>
>>
>> *********************************
>> This message and any attachments (the "message") are confidential and
>> intended solely for the addressees.
>> Any unauthorised use or dissemination is prohibited.
>> Messages are susceptible to alteration.
>> France Telecom Group shall not be liable for the message if altered, changed
>> or falsified.
>> If you are not the intended addressee of this message, please cancel it
>> immediately and inform the sender.
>> ********************************
>>
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>
>>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users