Skip to content

Can't invoke VarHandle.setVolatile from Scala #12348

@szegedi

Description

@szegedi

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 elided

problem

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions