kotlinx-atomicfu icon indicating copy to clipboard operation
kotlinx-atomicfu copied to clipboard

AtomicInt minusAssign not found

Open lppedd opened this issue 1 year ago • 2 comments
trafficstars

With 0.23.2, If I use the following piece of code:

val position: AtomicInt = atomic(1)
position -= 1

compilation on the JVM fails with:

> Task :myproject:compileKotlinJvm FAILED
e: java.lang.IllegalStateException: No minusAssign function found in CLASS CLASS name:AtomicIntegerFieldUpdater modality:FINAL visibility:public superTypes:[]
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.common.AbstractAtomicSymbols.getAtomicHandlerFunctionSymbol(AbstractAtomicSymbols.kt:84)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.JvmAtomicfuIrBuilder.callFieldUpdater(JvmAtomicfuIrBuilder.kt:75)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$JvmAtomicFunctionCallTransformer.transformAtomicUpdateCallOnProperty(AtomicfuJvmIrTransformer.kt:164)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.common.AbstractAtomicfuTransformer$AtomicFunctionCallTransformer.visitCall(AbstractAtomicfuTransformer.kt:602)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.common.AbstractAtomicfuTransformer$AtomicFunctionCallTransformer.visitCall(AbstractAtomicfuTransformer.kt:550)
	at org.jetbrains.kotlin.ir.expressions.IrCall.accept(IrCall.kt:26)

And on JS with:

> Task :myproject:compileKotlinJs FAILED
e: java.lang.IllegalStateException: Exception while looking for the function `atomicfu_minusAssign` in package `kotlinx.atomicfu`: Collection contains no element matching the predicate.
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.js.TransformerUtilKt.referencePackageFunction(TransformerUtil.kt:268)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.js.AtomicfuJsIrTransformer$AtomicTransformer.getRuntimeFunctionSymbol(AtomicfuJsIrTransformer.kt:414)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.js.AtomicfuJsIrTransformer$AtomicTransformer.inlineAtomicFunction(AtomicfuJsIrTransformer.kt:330)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.js.AtomicfuJsIrTransformer$AtomicTransformer.visitCall(AtomicfuJsIrTransformer.kt:180)
	at org.jetbrains.kotlinx.atomicfu.compiler.backend.js.AtomicfuJsIrTransformer$AtomicTransformer.visitCall(AtomicfuJsIrTransformer.kt:104)
	at org.jetbrains.kotlin.ir.expressions.IrCall.accept(IrCall.kt:26)

Note that I have:

# AtomicFU transformation via compiler plugin
kotlinx.atomicfu.enableJsIrTransformation = true
kotlinx.atomicfu.enableJvmIrTransformation = true
kotlinx.atomicfu.enableNativeIrTransformations = true

lppedd avatar Mar 25 '24 12:03 lppedd

Hi! kotlinx-atomicfu does not support minusAssign operator for atomics. Please use decrementAndGet() function instead:

val position: AtomicInt = atomic(1)
// ...
val newValue = position.decrementAndGet()

mvicsokolova avatar Mar 25 '24 13:03 mvicsokolova

Thanks @mvicsokolova. I ended up using the underlying getAndAdd function.
I did use minusAssign and plusAssign, as they're part of the AtomicInt API.

image

Maybe removing them would be better.

lppedd avatar Mar 25 '24 13:03 lppedd