Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Potential bug: Problem with switch statement

Thanks - would you enter this to the bug database?

Wes

Charles Zhang wrote:

Hi, AspectJ hackers, here is what I got tonight as a reproducable error.
Sorry, I searched a bit of the bugzilla but couldn't find anything
similar. It has something to do with a switch statement in the aspect
code. Thanks for any information.

To re-produce, compile the following on ajc1.1, ajc1.0, however, is OK.
Test.java
public class Test {
	public String method1(){
		System.out.println("method1");
		return "method1";
	}
	
	
	
	public static void  main(String [] args)
	{
		System.out.println(new Test().method1());
	}
}

===========TestAspect.java================
String around(Test t):target(t)&&
	call(public String method1())
	{
		int flag = 1;
		switch(flag)
		{
case 1: }
		return null;
	}


C:\eclipse\workspace\Test>c:\aspectj1.1\bin\ajc *.java > out
trouble in:
public class Test extends java.lang.Object:
  public void <init>():
                    ALOAD_0     // Test this   (line 13)
                    INVOKESPECIAL java.lang.Object.<init> ()V
                    ALOAD_0
                    INVOKESTATIC
Test1Aspect.ajc$interFieldInit$Test1Aspect$Test$flag (LTest;)V
    constructor-execution(void Test.<init>())
    |               RETURN
    constructor-execution(void Test.<init>())
  end public void <init>()

  public String method1():
    method-execution(java.lang.String Test.method1())
    | field-get(java.io.PrintStream java.lang.System.out)
    | |             GETSTATIC java.lang.System.out Ljava/io/PrintStream;
(line 15)
    | field-get(java.io.PrintStream java.lang.System.out)
    |               LDC "method1"
    | method-call(void java.io.PrintStream.println(java.lang.String))
    | |             INVOKEVIRTUAL java.io.PrintStream.println
(Ljava/lang/String;)V
    | method-call(void java.io.PrintStream.println(java.lang.String))
    |               LDC "method1"   (line 16)
    |               ARETURN
    method-execution(java.lang.String Test.method1())
  end public String method1()

  public String method2():
    method-execution(java.lang.String Test.method2())
    |               ALOAD_0     // Test this   (line 21)
    |               ASTORE_2
    | method-call(java.lang.String Test.method1())
    | |             ALOAD_0
    | |             ALOAD_2
    | |             INVOKESTATIC Test1Aspect.aspectOf ()LTest1Aspect;
    | |             ALOAD_2
    | |             ACONST_NULL
    | |             INVOKESTATIC Test.method1_aroundBody1$advice
(LTest;LTest;LTest1Aspect;LTest;Lorg/aspectj/runtime/in
ternal/AroundClosure;)Ljava/lang/String;
    | method-call(java.lang.String Test.method1())
    |               ASTORE_1
    |               NEW java.lang.StringBuffer   (line 22)
    |               DUP
    |               ALOAD_1     // java.lang.String s
    | method-call(java.lang.String
java.lang.String.valueOf(java.lang.Object))
    | |             INVOKESTATIC java.lang.String.valueOf
(Ljava/lang/Object;)Ljava/lang/String;
    | method-call(java.lang.String
java.lang.String.valueOf(java.lang.Object))
    | constructor-call(void
java.lang.StringBuffer.<init>(java.lang.String))
    | |             INVOKESPECIAL java.lang.StringBuffer.<init>
(Ljava/lang/String;)V
    | constructor-call(void
java.lang.StringBuffer.<init>(java.lang.String))
    |               LDC "method2"
    | method-call(java.lang.StringBuffer
java.lang.StringBuffer.append(java.lang.String))
    | |             INVOKEVIRTUAL java.lang.StringBuffer.append
(Ljava/lang/String;)Ljava/lang/StringBuffer;
    | method-call(java.lang.StringBuffer
java.lang.StringBuffer.append(java.lang.String))
    | method-call(java.lang.String java.lang.StringBuffer.toString())
    | |             INVOKEVIRTUAL java.lang.StringBuffer.toString
()Ljava/lang/String;
    | method-call(java.lang.String java.lang.StringBuffer.toString())
    |               ASTORE_1     // java.lang.String s
    | field-get(java.io.PrintStream java.lang.System.out)
    | |             GETSTATIC java.lang.System.out Ljava/io/PrintStream;
(line 23)
    | field-get(java.io.PrintStream java.lang.System.out)
    |               LDC "method2"
    | method-call(void java.io.PrintStream.println(java.lang.String))
    | |             INVOKEVIRTUAL java.io.PrintStream.println
(Ljava/lang/String;)V
    | method-call(void java.io.PrintStream.println(java.lang.String))
    |               ALOAD_1     // java.lang.String s   (line 24)
    |               ARETURN
    method-execution(java.lang.String Test.method2())
  end public String method2()

  public String method3():
    method-execution(java.lang.String Test.method3())
    | field-get(java.io.PrintStream java.lang.System.out)
    | |             GETSTATIC java.lang.System.out Ljava/io/PrintStream;
(line 30)
    | field-get(java.io.PrintStream java.lang.System.out)
    |               LDC "method3"
    | method-call(void java.io.PrintStream.println(java.lang.String))
    | |             INVOKEVIRTUAL java.io.PrintStream.println
(Ljava/lang/String;)V
    | method-call(void java.io.PrintStream.println(java.lang.String))
    |               NEW java.lang.String   (line 32)
    |               DUP
    |               LDC ""
    | constructor-call(void java.lang.String.<init>(java.lang.String))
    | |             INVOKESPECIAL java.lang.String.<init>
(Ljava/lang/String;)V
    | constructor-call(void java.lang.String.<init>(java.lang.String))
    |               ARETURN
    method-execution(java.lang.String Test.method3())
  end public String method3()

  public String method4():
    method-execution(java.lang.String Test.method4())
    |               ALOAD_0     // Test this   (line 37)
    |               ASTORE_2
    | method-call(java.lang.String Test.method1())
    | |             ALOAD_0
    | |             ALOAD_2
    | |             INVOKESTATIC Test1Aspect.aspectOf ()LTest1Aspect;
    | |             ALOAD_2
    | |             ACONST_NULL
    | |             INVOKESTATIC Test.method1_aroundBody3$advice
(LTest;LTest;LTest1Aspect;LTest;Lorg/aspectj/runtime/in
ternal/AroundClosure;)Ljava/lang/String;
    | method-call(java.lang.String Test.method1())
    |               ASTORE_1
    |               NEW java.lang.StringBuffer   (line 38)
    |               DUP
    |               ALOAD_1     // java.lang.String s
    | method-call(java.lang.String
java.lang.String.valueOf(java.lang.Object))
    | |             INVOKESTATIC java.lang.String.valueOf
(Ljava/lang/Object;)Ljava/lang/String;
    | method-call(java.lang.String
java.lang.String.valueOf(java.lang.Object))
    | constructor-call(void
java.lang.StringBuffer.<init>(java.lang.String))
    | |             INVOKESPECIAL java.lang.StringBuffer.<init>
(Ljava/lang/String;)V
    | constructor-call(void
java.lang.StringBuffer.<init>(java.lang.String))
    |               ALOAD_0     // Test this
    | method-call(java.lang.String Test.method2())
    | |             INVOKEVIRTUAL Test.method2 ()Ljava/lang/String;
    | method-call(java.lang.String Test.method2())
    | method-call(java.lang.StringBuffer
java.lang.StringBuffer.append(java.lang.String))
    | |             INVOKEVIRTUAL java.lang.StringBuffer.append
(Ljava/lang/String;)Ljava/lang/StringBuffer;
    | method-call(java.lang.StringBuffer
java.lang.StringBuffer.append(java.lang.String))
    | method-call(java.lang.String java.lang.StringBuffer.toString())
    | |             INVOKEVIRTUAL java.lang.StringBuffer.toString
()Ljava/lang/String;
    | method-call(java.lang.String java.lang.StringBuffer.toString())
    |               ASTORE_1     // java.lang.String s
    |               ALOAD_0     // Test this   (line 39)
    | method-call(java.lang.String Test.method3())
    | |             INVOKEVIRTUAL Test.method3 ()Ljava/lang/String;
    | method-call(java.lang.String Test.method3())
    |               POP
    |               ALOAD_1     // java.lang.String s   (line 40)
    |               ARETURN
    method-execution(java.lang.String Test.method4())
  end public String method4()

  public static void main(String[]):
    method-execution(void Test.main(java.lang.String[]))
    | field-get(java.io.PrintStream java.lang.System.out)
    | |             GETSTATIC java.lang.System.out Ljava/io/PrintStream;
(line 47)
    | field-get(java.io.PrintStream java.lang.System.out)
    |               NEW Test
    |               DUP
    | constructor-call(void Test.<init>())
    | |             INVOKESPECIAL Test.<init> ()V
    | constructor-call(void Test.<init>())
    | method-call(java.lang.String Test.method4())
    | |             INVOKEVIRTUAL Test.method4 ()Ljava/lang/String;
    | method-call(java.lang.String Test.method4())
    | method-call(void java.io.PrintStream.println(java.lang.String))
    | |             INVOKEVIRTUAL java.io.PrintStream.println
(Ljava/lang/String;)V
    | method-call(void java.io.PrintStream.println(java.lang.String))
    |               RETURN   (line 48)
    method-execution(void Test.main(java.lang.String[]))
  end public static void main(String[])

  static final String method1_aroundBody0(Test, Test):
                    ALOAD_1
                    INVOKEVIRTUAL Test.method1 ()Ljava/lang/String;
(line 21)
                    ARETURN
  end static final String method1_aroundBody0(Test, Test)

  static final String method1_aroundBody1$advice(Test, Test, Test1Aspect,
Test, org.aspectj.runtime.internal.AroundClosu
re):
    advice-execution(java.lang.String
Test1Aspect.ajc$around$Test1Aspect$e5(Test,
org.aspectj.runtime.internal.AroundClo
sure))
    |               ICONST_1   (line 18)
    |               ISTORE 5
    |               ILOAD 5   (line 19)
    |               TABLESWITCH
    |                 1:        null
    |                 default:  L0
    |           L0: ACONST_NULL   (line 23)
    |               ARETURN
    advice-execution(java.lang.String
Test1Aspect.ajc$around$Test1Aspect$e5(Test,
org.aspectj.runtime.internal.AroundClo
sure))
  end static final String method1_aroundBody1$advice(Test, Test,
Test1Aspect, Test, org.aspectj.runtime.internal.AroundC
losure)

  static final String method1_aroundBody2(Test, Test):
                    ALOAD_1
                    INVOKEVIRTUAL Test.method1 ()Ljava/lang/String;
(line 37)
                    ARETURN
  end static final String method1_aroundBody2(Test, Test)

  static final String method1_aroundBody3$advice(Test, Test, Test1Aspect,
Test, org.aspectj.runtime.internal.AroundClosu
re):
    advice-execution(java.lang.String
Test1Aspect.ajc$around$Test1Aspect$e5(Test,
org.aspectj.runtime.internal.AroundClo
sure))
    |               ICONST_1   (line 18)
    |               ISTORE 5
    |               ILOAD 5   (line 19)
    |               TABLESWITCH
    |                 1:        null
    |                 default:  L0
    |           L0: ACONST_NULL   (line 23)
    |               ARETURN
    advice-execution(java.lang.String
Test1Aspect.ajc$around$Test1Aspect$e5(Test,
org.aspectj.runtime.internal.AroundClo
sure))
  end static final String method1_aroundBody3$advice(Test, Test,
Test1Aspect, Test, org.aspectj.runtime.internal.AroundC
losure)
end public class Test
ABORT
Exception thrown from AspectJ 1.1.0

This might be logged as a bug already -- find current bugs at

http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler

Bugs for exceptions thrown have titles File:line from the top stack,
e.g., "SomeFile.java:243"

If you don't find the exception below in a bug, please add a new bug
at http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ
To make the bug a priority, please include a test program
that can reproduce this exception.
null
java.lang.NullPointerException
        at
org.aspectj.weaver.bcel.LazyMethodGen.remap(LazyMethodGen.java:892)
        at
org.aspectj.weaver.bcel.LazyMethodGen.packBody(LazyMethodGen.java:800)
        at
org.aspectj.weaver.bcel.LazyMethodGen.pack(LazyMethodGen.java:706)
        at
org.aspectj.weaver.bcel.LazyMethodGen.getMethod(LazyMethodGen.java:284)
        at
org.aspectj.weaver.bcel.LazyClassGen.writeBack(LazyClassGen.java:164)
        at
org.aspectj.weaver.bcel.LazyClassGen.getJavaClass(LazyClassGen.java:169)
        at org.aspectj.weaver.bcel.BcelWeaver.dump(BcelWeaver.java:417)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:364)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:335)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:272)
        at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.weaveAndGenerateClassFiles(AjBuildManager.java:256)
        at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:164)
        at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:78)
        at
org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:106)
        at
org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
        at org.aspectj.tools.ajc.Main.run(Main.java:217)
        at org.aspectj.tools.ajc.Main.runMain(Main.java:155)
        at org.aspectj.tools.ajc.Main.main(Main.java:72)


1 fail|abort




Charles Zhang 		(http://www.eecg.utoronto.ca/~czhang)
Computer Group, Dept. of Elec. & Comp. Engineering U. of Toronto, Ontario, Canada
*********************************************************
" Yawn!!" (Charles Zhang)

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users




Back to the top