Bug 490315 - InvokeDynamic.java:126 there is no classname for invokedynamic
Summary: InvokeDynamic.java:126 there is no classname for invokedynamic
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: IDE (show other bugs)
Version: unspecified   Edit
Hardware: PC Windows 7
: P3 critical (vote)
Target Milestone: 1.8.10   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-03-23 12:04 EDT by Sergey Olefir CLA
Modified: 2016-03-29 13:12 EDT (History)
1 user (show)

See Also:


Attachments
Eclipse AJDT project demonstrating the problem (12.06 KB, application/x-zip-compressed)
2016-03-29 07:07 EDT, Sergey Olefir CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Sergey Olefir CLA 2016-03-23 12:04:25 EDT
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
Comment 1 Andrew Clement CLA 2016-03-28 18:31:14 EDT
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.
Comment 2 Sergey Olefir CLA 2016-03-29 07:07:52 EDT
Created attachment 260602 [details]
Eclipse AJDT project demonstrating the problem
Comment 3 Sergey Olefir CLA 2016-03-29 07:15:16 EDT
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)
Comment 4 Andrew Clement CLA 2016-03-29 13:12:56 EDT
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