Bug 210032 - NullPointerException when weaving a class with a switch case on a class member enum
Summary: NullPointerException when weaving a class with a switch case on a class memb...
Status: RESOLVED DUPLICATE of bug 175039
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: 1.5.3   Edit
Hardware: PC Linux
: P3 minor (vote)
Target Milestone: 1.6.0 M2   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-11-15 16:51 EST by Frédéric Picard CLA
Modified: 2008-02-21 19:14 EST (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Frédéric Picard CLA 2007-11-15 16:51:16 EST
Build ID: I20061214-1445

Steps To Reproduce:
I have the following java class which I call in a webapp:

public class TestSwitch {
  private enum FilterOptionEnum {
    ALL,
    NONE
  }
  
  public void test() {
    FilterOptionEnum lFilterOption = FilterOptionEnum.ALL;
    switch (lFilterOption) {
      case ALL:
        lFilterOption = FilterOptionEnum.NONE;
        break;
      case NONE:
        lFilterOption = FilterOptionEnum.ALL;
        break;
    }
  }
}


When loading the class, I get the following stack trace:
[2007/11/15 16:20:57.814]**SEVR [11] trouble in:
public class com.bell.cts.prepaid.helpdesk.web.TestSwitch extends java.lang.Object:
  public void <init>():
                    ALOAD_0     // Lcom/bell/cts/prepaid/helpdesk/web/TestSwitch; this   (line 3)
                    INVOKESPECIAL java.lang.Object.<init> ()V
    constructor-execution(void com.bell.cts.prepaid.helpdesk.web.TestSwitch.<init>())
    |               RETURN   (line 4)
    constructor-execution(void com.bell.cts.prepaid.helpdesk.web.TestSwitch.<init>())
  end public void <init>()

  public void test():
    method-execution(void com.bell.cts.prepaid.helpdesk.web.TestSwitch.test())
    | field-get(com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.ALL)
    | |             GETSTATIC com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.ALL Lcom/bell/cts/prepaid/helpdesk/web/TestSwitch$FilterOptionEnum;   (line 10)
    | field-get(com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.ALL)
    |               ASTORE_1
    |               GETSTATIC com.bell.cts.prepaid.helpdesk.web.TestSwitch$1.$SwitchMap$com$bell$cts$prepaid$helpdesk$web$TestSwitch$FilterOptionEnum [I   (line 11)
    |               ALOAD_1     // Lcom/bell/cts/prepaid/helpdesk/web/TestSwitch$FilterOptionEnum; lFilterOption
    | method-call(int com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.ordinal())
    | |             INVOKEVIRTUAL com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.ordinal ()I
    | method-call(int com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.ordinal())
    |               IALOAD
    |               LOOKUPSWITCH
    |                 1:        L0
    |                 2:        L1
    |                 default:  L2
    |           L0: GETSTATIC com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.NONE Lcom/bell/cts/prepaid/helpdesk/web/TestSwitch$FilterOptionEnum;   (line 13)
    |               ASTORE_1     // Lcom/bell/cts/prepaid/helpdesk/web/TestSwitch$FilterOptionEnum; lFilterOption
    |               GOTO L2   (line 14)
    |           L1: GETSTATIC com.bell.cts.prepaid.helpdesk.web.TestSwitch$FilterOptionEnum.ALL Lcom/bell/cts/prepaid/helpdesk/web/TestSwitch$FilterOptionEnum;   (line 16)
    |               ASTORE_1     // Lcom/bell/cts/prepaid/helpdesk/web/TestSwitch$FilterOptionEnum; lFilterOption
    |           L2: RETURN   (line 19)
    method-execution(void com.bell.cts.prepaid.helpdesk.web.TestSwitch.test())
  end public void test()

end public class com.bell.cts.prepaid.helpdesk.web.TestSwitch
 (handleMessage, com.bell.cts.common.aop.logging.LoggingMessageHandler.java)
java.lang.ArrayIndexOutOfBoundsException: 0
        at org.aspectj.weaver.ResolvedType.getMemberParameterizationMap(ResolvedType.java:695)
        at org.aspectj.weaver.ReferenceType.getDeclaredInterfaces(ReferenceType.java:406)
        at org.aspectj.weaver.ResolvedType.getDirectSupertypes(ResolvedType.java:65)
        at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:352)
        at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:276)
        at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:300)
        at org.aspectj.weaver.JoinPointSignatureIterator.accumulateTypesInBetween(JoinPointSignatureIterator.java:147)
        at org.aspectj.weaver.JoinPointSignatureIterator.addSignaturesUpToFirstDefiningMember(JoinPointSignatureIterator.java:127)
        at org.aspectj.weaver.JoinPointSignatureIterator.<init>(JoinPointSignatureIterator.java:51)
        at org.aspectj.weaver.MemberImpl.getJoinPointSignatures(MemberImpl.java:961)
        at org.aspectj.weaver.patterns.SignaturePattern.matches(SignaturePattern.java:286)
        at org.aspectj.weaver.patterns.KindedPointcut.matchInternal(KindedPointcut.java:106)
        at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:146)
        at org.aspectj.weaver.patterns.AndPointcut.matchInternal(AndPointcut.java:52)
        at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:146)
        at org.aspectj.weaver.patterns.AndPointcut.matchInternal(AndPointcut.java:52)
        at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:146)
        at org.aspectj.weaver.ShadowMunger.match(ShadowMunger.java:75)
        at org.aspectj.weaver.Advice.match(Advice.java:112)
        at org.aspectj.weaver.bcel.BcelAdvice.match(BcelAdvice.java:118)
        at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:2806)
        at org.aspectj.weaver.bcel.BcelClassWeaver.matchInvokeInstruction(BcelClassWeaver.java:2768)
        at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:2506)
        at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:2332)
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:494)
        at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:119)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1612)
        at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1563)
        at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1341)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1161)
        at org.aspectj.weaver.tools.WeavingAdaptor.getWovenBytes(WeavingAdaptor.java:353)
        at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:260)
        at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:78)
        at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:55)
        at sun.instrument.TransformerManager.transform(TransformerManager.java:122)
        at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:155)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1629)
        at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:850)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1299)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1181)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at com.bell.cts.prepaid.helpdesk.web.Desktop.refreshScreen(Desktop.java:311)
        at com.bell.cts.prepaid.helpdesk.web.Desktop.<init>(Desktop.java:200)
        at com.bell.cts.prepaid.helpdesk.Helpdesk.init(Helpdesk.java:112)
        at nextapp.echo2.app.ApplicationInstance.doInit(ApplicationInstance.java:242)
        at nextapp.echo2.webcontainer.ContainerInstance.init(ContainerInstance.java:215)
        at nextapp.echo2.webcontainer.ContainerSynchronizeService.renderInit(ContainerSynchronizeService.java:418)
        at nextapp.echo2.webrender.service.SynchronizeService.service(SynchronizeService.java:269)
        at nextapp.echo2.webrender.WebRenderServlet.process(WebRenderServlet.java:273)
        at com.bell.cts.prepaid.helpdesk.servlet.HelpdeskContext.process(HelpdeskContext.java:157)
        at nextapp.echo2.webrender.WebRenderServlet.doPost(WebRenderServlet.java:189)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:481)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)

More information:
- The problem occured only with class member enum only (private or public). Using an enum from another class work well.
- The problem occured anytime a switch is done on that enum, whenever I have one case, all case or no case clause.
Comment 1 Andrew Clement CLA 2008-02-21 19:14:25 EST
The supplied testcode compiles standalone just fine.  I'd need more details of the aspect you apply to this type to try recreating it.  However, the stack trace is exactly as was reported in quite a few bugs a little while ago:

org.aspectj.weaver.ResolvedType.getMemberParameterizationMap(ResolvedType.java:695)

The primary bug under which they were all resolved was bug 175039 - this was fixed after 1.5.3 shipped and was included in 1.5.4.  So, I believe this bug is already fixed.  If you try a more recent AspectJ (1.5.4 or 1.6.0) and it still happens, feel free to reopen, but for now I'll close it as a dup of the original 175039.  The original problem was related to inner types - which the enum *is* in this case.

*** This bug has been marked as a duplicate of bug 175039 ***