Community
Participate
Working Groups
The following exception occurs twice (and shows modal error popups twice) each time I try to save any file containing advices in my project. This is obviously very annoying. I'm not sure what data is relevant to this, Eclipse is Version: Mars.1 Release (4.5.1) Build id: 20150924-1200 AJDT support was installed from: http://download.eclipse.org/tools/ajdt/45/dev/update/ (couldn't find non-dev release for Mars). m2e AJDT adapter (project is Maven-based) was installed via Preferences -> Maven -> Discovery and is: Maven Integration for AJDT (Optional) 0.14.0.201506231302 org.maven.ide.eclipse.ajdt.feature.feature.group Sonatype, Inc. Project didn't seem to convert to AspectJ by itself, so I did right-click -> Configure -> Convert to AspectJ project. It seems to work (it does show pointcuts & stuff). The following data will be sent: ------ STATUS ------ pluginId org.eclipse.ajdt.ui pluginVersion 2.2.4.201603152120 code 0 severity 4 message trouble in: [redacted] fingerprint b4b6d52c Exception:java.lang.IllegalStateException: there is no classname for invokedynamic at org.aspectj.apache.bcel.generic.InvokeDynamic.getClassName(InvokeDynamic.java:126) at org.aspectj.weaver.bcel.BcelAccessForInlineMunger.openAroundAdvice(BcelAccessForInlineMunger.java:141) at org.aspectj.weaver.bcel.BcelAccessForInlineMunger.munge(BcelAccessForInlineMunger.java:80) at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:440) at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:100) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1697) at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1641) at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1406) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1159) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:514) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.queueForWeaving(AjPipeliningCompilerAdapter.java:447) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterProcessing(AjPipeliningCompilerAdapter.java:432) at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$after$org_aspectj_ajdt_internal_compiler_CompilerAdapter$5$6b855184(CompilerAdapter.aj:103) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:902) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.processCompiledUnits(Compiler.java:545) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:458) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1036) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:272) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:185) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:320) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.incrementalBuild(AjBuildManager.java:189) at org.aspectj.ajde.core.internal.AjdeCoreBuildManager.performBuild(AjdeCoreBuildManager.java:127) at org.aspectj.ajde.core.AjCompiler.build(AjCompiler.java:91) at org.eclipse.ajdt.core.builder.AJBuilder.build(AJBuilder.java:257) at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:734) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:205) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:245) at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:300) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:303) at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:359) at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:382) at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:144) at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) ------ REPORT ------ eclipseBuildId 4.5.1.M20150904-0015 eclipseProduct org.eclipse.epp.package.jee.product javaRuntimeVersion 1.8.0_20-b26 osgiWs win32 osgiOs Windows7 osgiOsVersion 6.1.0 osgiArch x86_64 logMessage false ignoreSimilar false ------- BUNDLES ------- name org.aspectj.ajde version 1.8.9.201603152120 name org.aspectj.weaver version 1.8.9.201603152120 name org.eclipse.ajdt.core version 2.2.4.201603152120 name org.eclipse.core.jobs version 3.7.0.v20150330-2103 name org.eclipse.core.runtime version 3.11.1.v20150903-1804
Can you try turning off inlining to see if it helps? The command line flag is -XnoInline but it can also be set in the AJDT preferences for a project. The code to be affected by the around advice contains an invokedynamic. I'd be interested to know precisely what that code looks like if we could come up with a snippet. That will enable us to determine what we should do - probably skip the invokedynamic instruction since that code block only really wants to do special handling for super calls.
Created attachment 260602 [details] Eclipse AJDT project demonstrating the problem
Setting "No Inline" in AspectJ Options does appear to solve the problem (there are no exceptions on save). In terms of reproduction, I've managed to create a small AJDT project that reproduces the issue (attached). There's probably a lot of unnecessary stuff, but at least it reproduces the problem (it also seems that advice doesn't even need to match anything for the problem to manifest). There are at least three problems with FailingAspect: - Project -> Clean produces the exception originally reported in this issue every time (complete with modal dialog). - Trying to Refactor -> Rename variable 'piece' results in internal NPE in JDT and no renaming actually happens. - Incremental compilation (add a space and save) results in entirely different internal exception: java.lang.RuntimeException: Unknown constant type 18 at org.aspectj.apache.bcel.classfile.ConstantPool.constantToString(ConstantPool.java:212) at org.aspectj.apache.bcel.classfile.ConstantPool.constantToString(ConstantPool.java:254) at org.aspectj.apache.bcel.classfile.Utility.codeToString(Utility.java:1002) at org.aspectj.apache.bcel.classfile.Utility.codeToString(Utility.java:160) at org.aspectj.apache.bcel.classfile.Code.getCodeString(Code.java:372) at org.aspectj.weaver.bcel.BcelMethod.isEquivalentTo(BcelMethod.java:693) at org.aspectj.weaver.CrosscuttingMembers.equivalent(CrosscuttingMembers.java:500) at org.aspectj.weaver.CrosscuttingMembers.replaceWith(CrosscuttingMembers.java:319) at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:117) at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:68) at org.aspectj.weaver.bcel.BcelWeaver.prepareForWeave(BcelWeaver.java:511) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.ensureWeaverInitialized(AjPipeliningCompilerAdapter.java:529) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:509) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.queueForWeaving(AjPipeliningCompilerAdapter.java:447) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterProcessing(AjPipeliningCompilerAdapter.java:432) at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$after$org_aspectj_ajdt_internal_compiler_CompilerAdapter$5$6b855184(CompilerAdapter.aj:103) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:902) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.processCompiledUnits(Compiler.java:545) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:458) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1036) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:309) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.incrementalBuild(AjBuildManager.java:189) at org.aspectj.ajde.core.internal.AjdeCoreBuildManager.performBuild(AjdeCoreBuildManager.java:127) at org.aspectj.ajde.core.AjCompiler.build(AjCompiler.java:91) at org.eclipse.ajdt.core.builder.AJBuilder.build(AJBuilder.java:257) at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:734) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:205) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:245) at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:300) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:303) at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:359) at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:382) at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:144) at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Thanks so much for creating that testcode. Very helpful. Using that I could see that the problem was that the advice was declared with annotation style. This is handled differently to code style and thus was not triggering the guards that prevent advice inlining if the advice contains lambda usage (and thus invokedynamic instructions). Unlike regular code inlining which just involves copying a few instructions from one class to another, copying invokedynamics is much messier as it involves copying complex bootstrap entries in the constant pool. AspectJ doesn't do those yet so right now we cannot inline advice using lambdas. But it shouldn't fail when this happens, it should just fallback to the non-inline mechanism. AJDT builds are running right now with the changes in