diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2016-10-09 10:24:00 -0500 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2016-10-09 18:11:47 -0500 |
commit | e794e513264373bc73b0b338cb1fef647984e26a (patch) | |
tree | 3d0be200246e461c41a45fb03ad28299a9026cce /src/compiler/scala/tools | |
parent | ada6b6b67a0ee3fd4e8251d22abce1cdd6cbb931 (diff) | |
download | scala-e794e513264373bc73b0b338cb1fef647984e26a.tar.gz scala-e794e513264373bc73b0b338cb1fef647984e26a.tar.bz2 scala-e794e513264373bc73b0b338cb1fef647984e26a.zip |
Fix the interface flag when re-writing a closure call to the body method
When re-writing a closure invocation to the body method, the `itf` flag
of the invocation instruction was incorrect: it needs to be true if
the method is defined in an interface (including static methdos), not
if the method is invoked through `INVOKEINTERFACE`.
JDK 8 doesn't flag this inconsistency and executes the bytecode, but the
verifier in JDK 9 throws an `IncompatibleClassChangeError`.
Similar fixes went into e619b03.
Diffstat (limited to 'src/compiler/scala/tools')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala index 081830d61d..35ee5ba13d 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/ClosureOptimizer.scala @@ -325,8 +325,7 @@ class ClosureOptimizer[BT <: BTypes](val btypes: BT) { insns.insertBefore(invocation, new InsnNode(DUP)) INVOKESPECIAL } - val isInterface = bodyOpcode == INVOKEINTERFACE - val bodyInvocation = new MethodInsnNode(bodyOpcode, lambdaBodyHandle.getOwner, lambdaBodyHandle.getName, lambdaBodyHandle.getDesc, isInterface) + val bodyInvocation = new MethodInsnNode(bodyOpcode, lambdaBodyHandle.getOwner, lambdaBodyHandle.getName, lambdaBodyHandle.getDesc, lambdaBodyHandle.isInterface) ownerMethod.instructions.insertBefore(invocation, bodyInvocation) val bodyReturnType = Type.getReturnType(lambdaBodyHandle.getDesc) |