scala / scala-parallel-collections

Parallel collections standard library module for Scala 2.13+

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Unable to generate native image with GraalVM

wsuchy opened this issue · comments

Parallel collections used in Scala 2.13.3 can't be compiled via native-image / GraalVM due to the following error.
Note, that the same code compiles correctly, when downgraded to Scala 2.12.12.

 Invoke with MethodHandle argument could not be reduced to at most a single call or single field access. The method handle must be a compile time constant, e.g., be loaded from a `static final` field. Method that contains the method handle invocation: java.lang.invoke.LambdaForm$MH/1773403092.invoke_MT(Object, Object)
To diagnose the issue, you can add the option --report-unsupported-elements-at-runtime. The error is then reported at run time when the invoke is executed.
Detailed message:
Trace: 
	at parsing scala.runtime.Statics.releaseFence(Statics.java:148)
Call path from entry point to scala.runtime.Statics.releaseFence(): 
	at scala.runtime.Statics.releaseFence(Statics.java:148)
	at scala.collection.immutable.List.map(List.scala:255)
	at scala.collection.immutable.List.map(List.scala:79)
	at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.split(Tasks.scala:305)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.spawnSubtasks(Tasks.scala:184)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.spawnSubtasks$(Tasks.scala:180)
	at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.spawnSubtasks(Tasks.scala:303)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal(Tasks.scala:157)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal$(Tasks.scala:156)
	at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.internal(Tasks.scala:303)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute(Tasks.scala:149)
	at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute$(Tasks.scala:148)
	at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:303)
	at java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:163)
	at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
	at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
	at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0)

When running the program with --report-unsupported-elements-at-runtime flag

Exception in thread "main" com.oracle.svm.core.jdk.UnsupportedFeatureError: Invoke with MethodHandle argument could not be reduced to at most a single call or single field access. The method handle must be a compile time constant, e.g., be loaded from a `static final` field. Method that contains the method handle invocation: java.lang.invoke.LambdaForm$MH/810172214.invoke_MT(Object, Object)
	at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:86)
	at scala.runtime.Statics.releaseFence(Statics.java:148)
	at scala.collection.parallel.mutable.ResizableParArrayCombiner$ResizableParArrayCombinerC$1.<init>(ResizableParArrayCombiner.scala:87)
	at scala.collection.parallel.mutable.ResizableParArrayCombiner$.apply(ResizableParArrayCombiner.scala:88)
	at scala.collection.parallel.mutable.ResizableParArrayCombiner$.apply(ResizableParArrayCombiner.scala:90)
	at scala.collection.parallel.mutable.ParArray$.newCombiner(ParArray.scala:698)
	at scala.collection.parallel.ParIterableLike.$anonfun$flatMap$1(ParIterableLike.scala:498)
	at scala.collection.parallel.ParIterableLike.combinerFactory(ParIterableLike.scala:563)
	at scala.collection.parallel.ParIterableLike.combinerFactory$(ParIterableLike.scala:562)
	at scala.collection.parallel.mutable.ParArray.combinerFactory(ParArray.scala:55)
	at scala.collection.parallel.ParIterableLike.flatMap(ParIterableLike.scala:498)
	at scala.collection.parallel.ParIterableLike.flatMap$(ParIterableLike.scala:497)
	at scala.collection.parallel.mutable.ParArray.flatMap(ParArray.scala:55)

if the workaround doesn't solve it for scala-parallel-collections in particular, let us know and we can reopen the issue