Community
Participate
Working Groups
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:
Created attachment 33769 [details] Complete details from AJDT dialog
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.
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.
Helen - is this resolved now?
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)
Created attachment 38398 [details] File containing full exception dump
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.