Bug 125657 - NullPointerException from BcelShadow.java:1313
Summary: NullPointerException from BcelShadow.java:1313
Status: RESOLVED WONTFIX
Alias: None
Product: AspectJ
Classification: Tools
Component: LTWeaving (show other bugs)
Version: 1.5.0   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Helen Beeken CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-01-29 18:45 EST by Ulrik Skyt CLA
Modified: 2006-04-12 09:26 EDT (History)
0 users

See Also:


Attachments
Complete details from AJDT dialog (75.37 KB, text/plain)
2006-01-29 18:47 EST, Ulrik Skyt CLA
no flags Details
File containing full exception dump (75.27 KB, text/plain)
2006-04-12 09:18 EDT, Helen Beeken CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Ulrik Skyt CLA 2006-01-29 18:45:17 EST
From within Eclipse 3.0 (RAD 6.0.1) I get an error with the (partial) details listed below.  My aspect looks like this:

public aspect AAwtEventDispatcherThreadProtection
{
  pointcut awtComponentMethod(java.awt.Component component):
    target(component) && call(* *.*(..));

  before(java.awt.Component component): awtComponentMethod(component) {
    if (!SwingUtilities.isEventDispatchThread() && component.isDisplayable())
    {
      System.err.println("AWT Component method called from another Thread than the AWT-EventDispatchThread! source: " + 
                         thisJoinPoint.getSourceLocation() + ", target: " + thisJoinPoint.toLongString());
    }
  }
}

----------------
DETAILS (shortened because the size exceeded the 65k limit):


java.lang.NullPointerException
at 	at org.aspectj.weaver.bcel.BcelShadow.ensureTargetTypeIsCorrect(BcelShadow.java:1313)
at 	at org.aspectj.weaver.bcel.BcelShadow.initializeTargetVar(BcelShadow.java:1274)
at 	at org.aspectj.weaver.bcel.BcelShadow.getTargetVar(BcelShadow.java:968)
at 	at org.aspectj.weaver.patterns.ThisOrTargetPointcut.findResidueInternal(ThisOrTargetPointcut.java:185)
at 	at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:268)
at 	at org.aspectj.weaver.patterns.AndPointcut.findResidueInternal(AndPointcut.java:97)
at 	at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:268)
at 	at org.aspectj.weaver.patterns.AndPointcut.findResidueInternal(AndPointcut.java:97)
at 	at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:268)
at 	at org.aspectj.weaver.bcel.BcelAdvice.specializeOn(BcelAdvice.java:132)
at 	at org.aspectj.weaver.bcel.BcelShadow.prepareForMungers(BcelShadow.java:313)
at 	at org.aspectj.weaver.Shadow.implement(Shadow.java:404)
at 	at org.aspectj.weaver.bcel.BcelClassWeaver.implement(BcelClassWeaver.java:2146)
at 	at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:467)
at 	at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:102)
at 	at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1543)
at 	at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1494)
at 	at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1275)
at 	at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1097)
at 	at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave(AjCompilerAdapter.java:300)
at 	at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling(AjCompilerAdapter.java:178)
at 	at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:70)
at 	at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:367)
at 	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:811)
at 	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:230)
at 	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:156)
at 	at org.aspectj.ajde.internal.CompilerAdapter.compile(CompilerAdapter.java:122)
at 	at org.aspectj.ajde.internal.AspectJBuildManager$CompilerThread.run(AspectJBuildManager.java:191)

trouble in: 
public class com.sun.imageio.plugins.gif.GIFImageMetadata extends javax.imageio.metadata.IIOMetadata:
Comment 1 Ulrik Skyt CLA 2006-01-29 18:47:51 EST
Created attachment 33769 [details]
Complete details from AJDT dialog
Comment 2 Andrew Clement CLA 2006-01-30 02:46:53 EST
Relevant section from the attached log concerns clone():
===
when implementing on shadow method-call(java.lang.Object java.lang.Object.clone())
when weaving type com.sun.imageio.plugins.gif.GIFImageMetadata
===

The code in BcelShadow has changed since 1.5.0 shipped and now the relevant line is probably 1360 to do with determining the type for a clone call that is probably on an array.  A possible workaround is to extend your point to ignore clone:

  pointcut awtComponentMethod(java.awt.Component component):
    target(component) && call(* *.*(..)) && !call(* clone(..));

I can put a guard in to prevent us NPEing - but it may just cause us to fail later.  It appears to NPE when the local variable table info for a method is missing so we can't determine the type for an array clone call.  So, this class: GIFImageMetadata, is probably missing local variable info (debug info) - I guess you are just using this class from some jar?

I'll commit the change to avoid the NPE.
Comment 3 Ulrik Skyt CLA 2006-01-30 03:15:05 EST
Thanks for the quick response.
The class is from the graphics.jar in a version of JRE 1.4.2 from IBM.
However, after applying your suggestion to my pointcut I got a new bug: Bug 125670.
Comment 4 Andrew Clement CLA 2006-04-04 14:25:06 EDT
Helen - is this resolved now?
Comment 5 Helen Beeken CLA 2006-04-12 09:17:23 EDT
I've just retested this with the aspectj 1.5.1a, and although the originally reported NPE is no longer happening, I am now seeing the following BCException (note this is only when using the originally posted aspect that doesn't exclude clone() as suggested in comment #2):


org.aspectj.weaver.BCException
at org.aspectj.weaver.bcel.BcelShadow.ensureTargetTypeIsCorrect(BcelShadow.java:1397)
at org.aspectj.weaver.bcel.BcelShadow.initializeTargetVar(BcelShadow.java:1334)
at org.aspectj.weaver.bcel.BcelShadow.getTargetVar(BcelShadow.java:1026)
at org.aspectj.weaver.patterns.ThisOrTargetPointcut.findResidueInternal(ThisOrTargetPointcut.java:192)
at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:267)
at org.aspectj.weaver.patterns.AndPointcut.findResidueInternal(AndPointcut.java:93)
at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:267)
at org.aspectj.weaver.patterns.AndPointcut.findResidueInternal(AndPointcut.java:93)
at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:267)
at org.aspectj.weaver.bcel.BcelAdvice.specializeOn(BcelAdvice.java:132)
at org.aspectj.weaver.bcel.BcelShadow.prepareForMungers(BcelShadow.java:325)
at org.aspectj.weaver.Shadow.implement(Shadow.java:455)
at org.aspectj.weaver.bcel.BcelClassWeaver.implement(BcelClassWeaver.java:2236)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:491)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:109)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1560)
at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1511)
at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1291)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1113)
at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave(AjCompilerAdapter.java:311)
at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling(AjCompilerAdapter.java:183)
at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:70)
at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:367)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:862)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:242)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:161)
at org.aspectj.ajde.internal.CompilerAdapter.compile(CompilerAdapter.java:122)
at org.aspectj.ajde.internal.AspectJBuildManager$CompilerThread.run(AspectJBuildManager.java:191)

Comment 6 Helen Beeken CLA 2006-04-12 09:18:32 EDT
Created attachment 38398 [details]
File containing full exception dump
Comment 7 Helen Beeken CLA 2006-04-12 09:26:51 EDT
Closing this bug as WONTFIX since the BCException is a limitation to do with the clone method and not being able to work out who clone was called on. A valid workaround is to exclude clone within the pointcut as suggested in comment #2.