Skip to content

Commit 10f7065

Browse files
mvicsokolovaelizarov
authored andcommitted
Transformed operand stack for setValue on static atomic field fixed.
Fixes #151
1 parent 038cd02 commit 10f7065

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

atomicfu-transformer/src/main/kotlin/kotlinx/atomicfu/transformer/AtomicFUTransformer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,6 @@ class AtomicFUTransformer(
636636
check(!f.isArray || onArrayElement) { "getValue/setValue can only be called on elements of arrays" }
637637
val setInsn = iv.name == SET_VALUE
638638
if (!onArrayElement) {
639-
instructions.remove(ld) // drop getstatic (we don't need field updater)
640639
val primitiveType = f.getPrimitiveType(vh)
641640
val owner = if (!vh && f.isStatic) f.refVolatileClassName else f.owner
642641
if (!vh && f.isStatic) {
@@ -646,8 +645,9 @@ class AtomicFUTransformer(
646645
f.staticRefVolatileField,
647646
getObjectType(owner).descriptor
648647
)
649-
instructions.insertBefore(iv, getOwnerClass)
648+
instructions.insert(ld, getOwnerClass)
650649
}
650+
instructions.remove(ld) // drop getstatic (we don't need field updater)
651651
val j = FieldInsnNode(
652652
when {
653653
iv.name == GET_VALUE -> if (f.isStatic && vh) GETSTATIC else GETFIELD

atomicfu/src/commonTest/kotlin/kotlinx/atomicfu/test/TopLevelTest.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ class TopLevelPrimitiveTest {
2727
check(a.value == 0)
2828
check(a.getAndSet(3) == 0)
2929
check(a.compareAndSet(3, 8))
30-
a.lazySet(1)
30+
a.lazySet(5)
31+
check(a.value == 5)
32+
a.value = 1
3133
check(a.value == 1)
3234
check(a.getAndSet(2) == 1)
3335
check(a.value == 2)
@@ -51,7 +53,9 @@ class TopLevelPrimitiveTest {
5153
check(b.value == 2424920024888888848)
5254
b.lazySet(8424920024888888848)
5355
check(b.value == 8424920024888888848)
54-
check(b.getAndSet(8924920024888888848) == 8424920024888888848)
56+
b.value = 8424920024888888833
57+
check(b.value == 8424920024888888833)
58+
check(b.getAndSet(8924920024888888848) == 8424920024888888833)
5559
check(b.value == 8924920024888888848)
5660
check(b.incrementAndGet() == 8924920024888888849)
5761
check(b.value == 8924920024888888849)
@@ -72,6 +76,8 @@ class TopLevelPrimitiveTest {
7276
check(c.value)
7377
c.lazySet(false)
7478
check(!c.value)
79+
c.value = false
80+
check(!c.value)
7581
check(!c.getAndSet(true))
7682
check(c.compareAndSet(true, false))
7783
check(!c.value)
@@ -86,6 +92,8 @@ class TopLevelPrimitiveTest {
8692
val l = IntArray(4){i -> i}
8793
any.lazySet(l)
8894
check((any.value as IntArray)[2] == 2)
95+
abcNode.value = ANode(BNode(CNode(88)))
96+
check(abcNode.value.b.c.d == 88)
8997
}
9098

9199
@Test

0 commit comments

Comments
 (0)