[K/N] Do not cast the result of atomicGet/atomicSet invocation from Boolean to Byte in VolatileFieldsLowering, because this cast is done by the property getter.
Merge-request: KT-MR-11347 Merged-by: Maria Sokolova <maria.sokolova@jetbrains.com>
This commit is contained in:
@@ -75,6 +75,13 @@ class ByteWrapper(@Volatile var x : Byte) : IncWrapper<Byte> {
|
||||
override fun getAndAdd(delta: Byte) = this::x.getAndAddFieldLocal(delta)
|
||||
}
|
||||
|
||||
class BooleanWrapper(@Volatile var x : Boolean) : Wrapper<Boolean> {
|
||||
override fun get(): Boolean = this::x.atomicGetField()
|
||||
override fun set(new: Boolean) = this::x.atomicSetField(new)
|
||||
override fun compareAndSwap(expected: Boolean, new: Boolean) = this::x.compareAndExchangeField(expected, new)
|
||||
override fun compareAndSet(expected: Boolean, new: Boolean) = this::x.compareAndSetField(expected, new)
|
||||
override fun getAndSet(new: Boolean) = this::x.getAndSetField(new)
|
||||
}
|
||||
|
||||
class StringWrapper(@Volatile var x : String) : RefWrapper<String> {
|
||||
override fun get(): String = this::x.atomicGetField()
|
||||
@@ -137,6 +144,7 @@ fun box() : String {
|
||||
test(1, 2, 3, ::LongWrapper)?.let { return "Long: $it" }
|
||||
test(1, 2, 3, ::ShortWrapper)?.let { return "Short: $it" }
|
||||
test(1, 2, 3, ::ByteWrapper)?.let { return "Byte: $it" }
|
||||
test(true, false, true, ::BooleanWrapper)?.let { return "Boolean: $it" }
|
||||
test("1", "2", "3", ::StringWrapper)?.let { return "String: $it" }
|
||||
test("1", "2", "3", { GenericWrapper<String>(it) })?.let { return "Generic<String>: $it" }
|
||||
test(1, 2, 3, { GenericWrapper<Int>(it) })?.let { return "Generic<Int>: $it" }
|
||||
|
||||
+3
@@ -246,6 +246,9 @@ internal class VolatileFieldsLowering(val context: Context) : FileLoweringPass {
|
||||
putValueArgument(index, expression.getValueArgument(index))
|
||||
}
|
||||
}.let {
|
||||
if (intrinsicType == IntrinsicType.ATOMIC_GET_FIELD || intrinsicType == IntrinsicType.ATOMIC_SET_FIELD) {
|
||||
return it
|
||||
}
|
||||
if (backingField.requiresBooleanConversion()) {
|
||||
for (arg in 0 until it.valueArgumentsCount) {
|
||||
it.putValueArgument(arg, builder.irBoolToByte(it.getValueArgument(arg)!!))
|
||||
|
||||
Reference in New Issue
Block a user