Open
Description
With Scala 2.13.16 if you try inlining code that has been added to your classpath as an ijar/hjar it throws an exception:
error: java.lang.IndexOutOfBoundsException
at scala.tools.asm.tree.InsnList.get(InsnList.java:94)
at scala.tools.nsc.backend.jvm.analysis.BackendUtils$.computeMaxLocalsMaxStack(BackendUtils.scala:728)
at scala.tools.nsc.backend.jvm.analysis.BackendUtils$.maxLocals(BackendUtils.scala:636)
at scala.tools.nsc.backend.jvm.opt.Inliner.inlineCallsite(Inliner.scala:856)
at scala.tools.nsc.backend.jvm.opt.Inliner.$anonfun$runInliner$10(Inliner.scala:352)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:619)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:617)
at scala.collection.AbstractIterable.foreach(Iterable.scala:935)
at scala.collection.IterableOps$WithFilter.foreach(Iterable.scala:905)
at scala.tools.nsc.backend.jvm.opt.Inliner.runInliner(Inliner.scala:378)
at scala.tools.nsc.backend.jvm.opt.Inliner.runInlinerAndClosureOptimizer(Inliner.scala:281)
at scala.tools.nsc.backend.jvm.PostProcessor.runGlobalOptimizations(PostProcessor.scala:156)
at scala.tools.nsc.backend.jvm.GeneratedClassHandler$GlobalOptimisingGeneratedClassHandler.complete(GeneratedClassHandler.scala:98)
at scala.tools.nsc.backend.jvm.GenBCode$BCodePhase.$anonfun$run$1(GenBCode.scala:81)
at scala.tools.nsc.backend.jvm.GenBCode$BCodePhase.run(GenBCode.scala:78)
at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1564)
at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1548)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:1540)
at scala.tools.nsc.Global$Run.compile(Global.scala:1674)
at scala.tools.nsc.Driver.doCompile(Driver.scala:48)
at scala.tools.nsc.MainClass.doCompile(Main.scala:30)
at scala.tools.nsc.Driver.process(Driver.scala:68)
at io.bazel.rulesscala.scalac.ScalacInvoker.invokeCompiler(ScalacInvoker.java:24)
at io.bazel.rulesscala.scalac.ScalacWorker.compileScalaSources(ScalacWorker.java:272)
at io.bazel.rulesscala.scalac.ScalacWorker.work(ScalacWorker.java:88)
at io.bazel.rulesscala.worker.Worker.persistentWorkerMain(Worker.java:96)
at io.bazel.rulesscala.worker.Worker.workerMain(Worker.java:49)
at io.bazel.rulesscala.scalac.ScalacWorker.main(ScalacWorker.java:48)
java.lang.IndexOutOfBoundsException
at scala.tools.asm.tree.InsnList.get(InsnList.java:94)
at scala.tools.nsc.backend.jvm.analysis.BackendUtils$.computeMaxLocalsMaxStack(BackendUtils.scala:728)
at scala.tools.nsc.backend.jvm.analysis.BackendUtils$.maxLocals(BackendUtils.scala:636)
at scala.tools.nsc.backend.jvm.opt.Inliner.inlineCallsite(Inliner.scala:856)
at scala.tools.nsc.backend.jvm.opt.Inliner.$anonfun$runInliner$10(Inliner.scala:352)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:619)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:617)
at scala.collection.AbstractIterable.foreach(Iterable.scala:935)
at scala.collection.IterableOps$WithFilter.foreach(Iterable.scala:905)
at scala.tools.nsc.backend.jvm.opt.Inliner.runInliner(Inliner.scala:378)
at scala.tools.nsc.backend.jvm.opt.Inliner.runInlinerAndClosureOptimizer(Inliner.scala:281)
at scala.tools.nsc.backend.jvm.PostProcessor.runGlobalOptimizations(PostProcessor.scala:156)
at scala.tools.nsc.backend.jvm.GeneratedClassHandler$GlobalOptimisingGeneratedClassHandler.complete(GeneratedClassHandler.scala:98)
at scala.tools.nsc.backend.jvm.GenBCode$BCodePhase.$anonfun$run$1(GenBCode.scala:81)
at scala.tools.nsc.backend.jvm.GenBCode$BCodePhase.run(GenBCode.scala:78)
at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1564)
at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1548)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:1540)
at scala.tools.nsc.Global$Run.compile(Global.scala:1674)
at scala.tools.nsc.Driver.doCompile(Driver.scala:48)
at scala.tools.nsc.MainClass.doCompile(Main.scala:30)
at scala.tools.nsc.Driver.process(Driver.scala:68)
at io.bazel.rulesscala.scalac.ScalacInvoker.invokeCompiler(ScalacInvoker.java:24)
at io.bazel.rulesscala.scalac.ScalacWorker.compileScalaSources(ScalacWorker.java:272)
at io.bazel.rulesscala.scalac.ScalacWorker.work(ScalacWorker.java:88)
at io.bazel.rulesscala.worker.Worker.persistentWorkerMain(Worker.java:96)
at io.bazel.rulesscala.worker.Worker.workerMain(Worker.java:49)
at io.bazel.rulesscala.scalac.ScalacWorker.main(ScalacWorker.java:48)
This seems to be a Scala regression since 2.13.9+ and Scala declares that it will fix it in 2.13.17.
Steps to reproduce:
git clone git@github.com:gergelyfabian/bazel-scala-example.git
cd bazel-scala-example
git checkout scala-compiler-bug
bazel build //example-maven:example-maven
Example code:
package mypackage
import com.google.protobuf.CodedOutputStream
object Maven {
def repro(): Unit = {
val result = new Array[Byte](0)
CodedOutputStream.newInstance(result)
}
}
Using the following scalacopt: -opt-inline-from:**
.
Once Scala fixes this bug, it will stop inlining code from signature jar files, but you'll get a warning:
$> scq T.scala -cp libcore-hjar.jar:liblite_runtime_only-hjar.jar '-opt:inline:**' -Wopt:_
T.scala:6: warning: com/google/protobuf/CodedOutputStream::newInstance([B)Lcom/google/protobuf/CodedOutputStream; could not be inlined:
Method com/google/protobuf/CodedOutputStream::newInstance([B)Lcom/google/protobuf/CodedOutputStream; cannot be inlined because it does not have any instructions, even though it is not abstract. The class may come from a signature jar file (such as a Bazel 'hjar').
CodedOutputStream.newInstance(result)
^
1 warning
This behavior is caused by Bazel using hjars/ijars for dependencies.
Related Bazel Slack topics:
Metadata
Metadata
Assignees
Labels
No labels