-
Notifications
You must be signed in to change notification settings - Fork 22
Closed
scala/scala
#9530Milestone
Description
reproduction steps
using Scala 2.13.3 on Java 11.0.10,
scala> val a = new Array[Object](1)
val a: Array[Object] = Array(null)
scala> val h = java.lang.invoke.MethodHandles.arrayElementVarHandle(a.getClass)
val h: java.lang.invoke.VarHandle = java.lang.invoke.VarHandleObjects$Array@47148f3f
scala> h.setVolatile(a, 0, "foo")
java.lang.NoSuchMethodError: VarHandle.setVolatile(Object[],int,String)Object
at java.base/java.lang.invoke.MethodHandleNatives.newNoSuchMethodErrorOnVarHandle(MethodHandleNatives.java:576)
at java.base/java.lang.invoke.MethodHandleNatives.varHandleOperationLinkerMethod(MethodHandleNatives.java:529)
at java.base/java.lang.invoke.MethodHandleNatives.linkMethodImpl(MethodHandleNatives.java:462)
at java.base/java.lang.invoke.MethodHandleNatives.linkMethod(MethodHandleNatives.java:450)
... 32 elidedproblem
I would expect this to succeed without the exception.
If the code containing these steps is compiled with scalac , it can be seen that it emits the call to setVolatile with wrong return type Object instead of void:
invokevirtual java/lang/invoke/VarHandle.setVolatile:([Ljava/lang/Object;ILjava/lang/String;)Ljava/lang/Object;
pop
Since VarHandle.setVolatile is declared to return void, scalac is emitting wrong return type, it should emit void:
invokevirtual java/lang/invoke/VarHandle.setVolatile:([Ljava/lang/Object;ILjava/lang/String;)V
Reactions are currently unavailable