[atomicfu-JVM] Preparation for commonization of JVM and K/N transformers

The following updates in the JVM/IR plugin were made:
* Lots of refactoring with preparation for K/N support: commonization of transformations.
* Improved error handling (checks for visibility constraints, appending message about usage constraints in case of an error).
* Explicit requirements for the visibility of atomic properties: to prevent leaking they should be private/internal or be members of private/internal classes.
* Fixed visibility of generated properties: volatile properties are always private and atomic updaters have the same visibility as the original atomic property.
* Volatile fields are generated from scratch and original atomic properties are removed.
* Delegated properties support is fixed (only declaration in the same scope is allowed).
* Non-inline atomic extensions are forbidden.
* For top-level atomics: only one wrapper class per file (with corresponding visibility) is generated.
* Bug fixes.

The corresponding tickets: 
https://github.com/Kotlin/kotlinx-atomicfu/issues/322
KT-60528



Merge-request: KT-MR-10579
Merged-by: Maria Sokolova <maria.sokolova@jetbrains.com>
This commit is contained in:
mvicsokolova
2023-07-20 13:59:23 +00:00
committed by Space Team
parent 6ca95dc338
commit 5c5367d377
92 changed files with 3480 additions and 2575 deletions
@@ -0,0 +1,67 @@
import kotlinx.atomicfu.*
import kotlin.test.*
import kotlin.random.*
private object Provider {
private val port = atomic(Random.nextInt(20, 90) * 100)
fun next(): Int = port.incrementAndGet()
private val _l = atomic(2424920024888888848)
fun getL() = _l.incrementAndGet()
val _ref = atomic<String?>(null)
val _x = atomic(false)
val intArr = AtomicIntArray(10)
val longArr = AtomicLongArray(10)
val refArr = atomicArrayOfNulls<Any?>(5)
}
private object DelegatedProvider {
internal val _a = atomic(42)
var a: Int by _a
var vInt by atomic(77)
}
private fun testFieldInObject() {
val port = Provider.next()
assertEquals(port + 1, Provider.next())
assertEquals(2424920024888888849, Provider.getL())
Provider._ref.compareAndSet(null, "abc")
assertEquals("abc", Provider._ref.value)
assertFalse(Provider._x.value)
Provider.intArr[8].value = 454
assertEquals(455, Provider.intArr[8].incrementAndGet())
Provider.longArr[8].value = 4544096409680468
assertEquals(4544096409680470, Provider.longArr[8].addAndGet(2))
Provider.refArr[1].value = Provider._ref.value
assertEquals("abc", Provider.refArr[1].value)
}
private fun testDelegatedPropertiesInObject() {
assertEquals(42, DelegatedProvider.a)
DelegatedProvider._a.compareAndSet(42, 56)
assertEquals(56, DelegatedProvider.a)
DelegatedProvider.a = 77
DelegatedProvider._a.compareAndSet(77, 66)
assertEquals(66, DelegatedProvider._a.value)
assertEquals(66, DelegatedProvider.a)
assertEquals(77, DelegatedProvider.vInt)
DelegatedProvider.vInt = 55
assertEquals(110, DelegatedProvider.vInt * 2)
}
fun box(): String {
testFieldInObject()
testDelegatedPropertiesInObject()
return "OK"
}
@@ -0,0 +1,97 @@
@kotlin.Metadata
synthetic final class DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private {
// source: 'FieldInObjectTest.kt'
private synthetic final static field _a$volatile$FU: java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic volatile field _a$volatile: int
static method <clinit>(): void
private method <init>(): void
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
public synthetic final static method access$get_a$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
public synthetic final static method access$get_a$volatile$p(p0: DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private): int
public synthetic final static method access$set_a$volatile$p(p0: DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private, p1: int): void
private synthetic final static method get_a$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final method get_a$volatile(): int
private synthetic final method set_a$volatile(p0: int): void
private synthetic inner class DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private
}
@kotlin.Metadata
final class DelegatedProvider {
// source: 'FieldInObjectTest.kt'
public final static @org.jetbrains.annotations.NotNull field INSTANCE: DelegatedProvider
private synthetic final static field delegatedProvider$VolatileWrapper$atomicfu$private: DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private
private synthetic volatile field vInt$volatile: int
static method <clinit>(): void
private method <init>(): void
public synthetic final static method access$getDelegatedProvider$VolatileWrapper$atomicfu$private(): DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private
public final method getA(): int
private synthetic final static method getDelegatedProvider$VolatileWrapper$atomicfu$private(): DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private
public final method getVInt(): int
public final method setA(p0: int): void
public final method setVInt(p0: int): void
private synthetic inner class DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private
}
@kotlin.Metadata
public final class FieldInObjectTestKt {
// source: 'FieldInObjectTest.kt'
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
private final static method testDelegatedPropertiesInObject(): void
private final static method testFieldInObject(): void
private synthetic inner class DelegatedProvider$DelegatedProvider$VolatileWrapper$atomicfu$private
private synthetic inner class Provider$Provider$VolatileWrapper$atomicfu$private
}
@kotlin.Metadata
synthetic final class Provider$Provider$VolatileWrapper$atomicfu$private {
// source: 'FieldInObjectTest.kt'
private synthetic final static field _l$volatile$FU: java.util.concurrent.atomic.AtomicLongFieldUpdater
private synthetic volatile field _l$volatile: long
private synthetic final static field _ref$volatile$FU: java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic volatile field _ref$volatile: java.lang.Object
private synthetic final static field _x$volatile$FU: java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic volatile field _x$volatile: int
private synthetic final static field port$volatile$FU: java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic volatile field port$volatile: int
static method <clinit>(): void
private method <init>(): void
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
public synthetic final static method access$getPort$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
public synthetic final static method access$get_l$volatile$FU(): java.util.concurrent.atomic.AtomicLongFieldUpdater
public synthetic final static method access$get_ref$volatile$FU(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
public synthetic final static method access$get_x$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final static method getPort$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final method getPort$volatile(): int
private synthetic final static method get_l$volatile$FU(): java.util.concurrent.atomic.AtomicLongFieldUpdater
private synthetic final method get_l$volatile(): long
private synthetic final static method get_ref$volatile$FU(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic final method get_ref$volatile(): java.lang.Object
private synthetic final static method get_x$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final method get_x$volatile(): int
private synthetic final method setPort$volatile(p0: int): void
private synthetic final method set_l$volatile(p0: long): void
private synthetic final method set_ref$volatile(p0: java.lang.Object): void
private synthetic final method set_x$volatile(p0: int): void
private synthetic inner class Provider$Provider$VolatileWrapper$atomicfu$private
public final inner class kotlin/random/Random$Default
}
@kotlin.Metadata
final class Provider {
// source: 'FieldInObjectTest.kt'
public final static @org.jetbrains.annotations.NotNull field INSTANCE: Provider
private synthetic final static field intArr: java.util.concurrent.atomic.AtomicIntegerArray
private synthetic final static field longArr: java.util.concurrent.atomic.AtomicLongArray
private synthetic final static field provider$VolatileWrapper$atomicfu$private: Provider$Provider$VolatileWrapper$atomicfu$private
private synthetic final static field refArr: java.util.concurrent.atomic.AtomicReferenceArray
static method <clinit>(): void
private method <init>(): void
public synthetic final static method access$getProvider$VolatileWrapper$atomicfu$private(): Provider$Provider$VolatileWrapper$atomicfu$private
public synthetic final method getIntArr(): java.util.concurrent.atomic.AtomicIntegerArray
public final method getL(): long
public synthetic final method getLongArr(): java.util.concurrent.atomic.AtomicLongArray
private synthetic final static method getProvider$VolatileWrapper$atomicfu$private(): Provider$Provider$VolatileWrapper$atomicfu$private
public synthetic final method getRefArr(): java.util.concurrent.atomic.AtomicReferenceArray
public final method next(): int
private synthetic inner class Provider$Provider$VolatileWrapper$atomicfu$private
}
@@ -0,0 +1,182 @@
import kotlinx.atomicfu.*
import kotlin.test.*
private val a = atomic(0)
private val b = atomic(2424920024888888848)
private val c = atomic(true)
private val abcNode = atomic(ANode(BNode(CNode(8))))
private val any = atomic<Any?>(null)
internal val a_internal = atomic(0)
internal val b_internal = atomic(2424920024888888848)
internal val c_internal = atomic(true)
internal val abcNode_internal = atomic(ANode(BNode(CNode(8))))
internal val any_internal = atomic<Any?>(null)
private val intArr = AtomicIntArray(3)
private val longArr = AtomicLongArray(5)
private val booleanArr = AtomicBooleanArray(4)
private val refArr = atomicArrayOfNulls<ANode<BNode<CNode>>>(5)
private val anyRefArr = atomicArrayOfNulls<Any>(10)
private val stringAtomicNullArr = atomicArrayOfNulls<String>(10)
class TopLevelPrimitiveTest {
fun testTopLevelInt() {
assertEquals(0, a.value)
assertEquals(0, a.getAndSet(3))
assertTrue(a.compareAndSet(3, 8))
a.lazySet(1)
assertEquals(1, a.value)
assertEquals(1, a.getAndSet(2))
assertEquals(2, a.value)
assertEquals(2, a.getAndIncrement())
assertEquals(3, a.value)
assertEquals(3, a.getAndDecrement())
assertEquals(2, a.value)
assertEquals(2, a.getAndAdd(2))
assertEquals(4, a.value)
assertEquals(7, a.addAndGet(3))
assertEquals(7, a.value)
assertEquals(8, a.incrementAndGet())
assertEquals(8, a.value)
assertEquals(7, a.decrementAndGet())
assertEquals(7, a.value)
assertTrue(a.compareAndSet(7, 10))
}
fun testTopLevelLong() {
assertEquals(2424920024888888848, b.value)
b.lazySet(8424920024888888848)
assertEquals(8424920024888888848, b.value)
assertEquals(8424920024888888848, b.getAndSet(8924920024888888848))
assertEquals(8924920024888888848, b.value)
assertEquals(8924920024888888849, b.incrementAndGet())
assertEquals(8924920024888888849, b.value)
assertEquals(8924920024888888849, b.getAndDecrement())
assertEquals(8924920024888888848, b.value)
assertEquals(8924920024888888848, b.getAndAdd(100000000000000000))
assertEquals(9024920024888888848, b.value)
assertEquals(-198452011965886959, b.addAndGet(-9223372036854775807))
assertEquals(-198452011965886959, b.value)
assertEquals(-198452011965886958, b.incrementAndGet())
assertEquals(-198452011965886958, b.value)
assertEquals(-198452011965886959, b.decrementAndGet())
assertEquals(-198452011965886959, b.value)
}
fun testTopLevelBoolean() {
assertTrue(c.value)
c.lazySet(false)
assertFalse(c.value)
assertTrue(!c.getAndSet(true))
assertTrue(c.compareAndSet(true, false))
assertFalse(c.value)
}
fun testTopLevelRef() {
assertEquals(8, abcNode.value.b.c.d)
val newNode = ANode(BNode(CNode(76)))
assertEquals(8, abcNode.getAndSet(newNode).b.c.d)
assertEquals(76, abcNode.value.b.c.d)
val l = IntArray(4){i -> i}
any.lazySet(l)
assertEquals(2, (any.value as IntArray)[2])
}
fun testTopLevelArrayOfNulls() {
assertEquals(null, stringAtomicNullArr[0].value)
assertTrue(stringAtomicNullArr[0].compareAndSet(null, "aa"))
stringAtomicNullArr[1].lazySet("aa")
assertTrue(stringAtomicNullArr[0].value == stringAtomicNullArr[1].value)
}
}
class TopLevelArrayTest {
fun testIntArray() {
assertTrue(intArr[0].compareAndSet(0, 3))
assertEquals(0, intArr[1].value)
intArr[0].lazySet(5)
assertEquals(5, intArr[0].value + intArr[1].value + intArr[2].value)
assertTrue(intArr[0].compareAndSet(5, 10))
assertEquals(10, intArr[0].getAndDecrement())
assertEquals(9, intArr[0].value)
intArr[2].value = 2
assertEquals(2, intArr[2].value)
assertTrue(intArr[2].compareAndSet(2, 34))
assertEquals(34, intArr[2].value)
}
fun testLongArray() {
longArr[0].value = 2424920024888888848
assertEquals(2424920024888888848, longArr[0].value)
longArr[0].lazySet(8424920024888888848)
assertEquals(8424920024888888848, longArr[0].value)
val ac = longArr[0].value
longArr[3].value = ac
assertEquals(8424920024888888848, longArr[3].getAndSet(8924920024888888848))
assertEquals(8924920024888888848, longArr[3].value)
val ac1 = longArr[3].value
longArr[4].value = ac1
assertEquals(8924920024888888849, longArr[4].incrementAndGet())
assertEquals(8924920024888888849, longArr[4].value)
assertEquals(8924920024888888849, longArr[4].getAndDecrement())
assertEquals(8924920024888888848, longArr[4].value)
longArr[4].value = 8924920024888888848
assertEquals(8924920024888888848, longArr[4].getAndAdd(100000000000000000))
val ac2 = longArr[4].value
longArr[1].value = ac2
assertEquals(9024920024888888848, longArr[1].value)
assertEquals(-198452011965886959, longArr[1].addAndGet(-9223372036854775807))
assertEquals(-198452011965886959, longArr[1].value)
assertEquals(-198452011965886958, longArr[1].incrementAndGet())
assertEquals(-198452011965886958, longArr[1].value)
assertEquals(-198452011965886959, longArr[1].decrementAndGet())
assertEquals(-198452011965886959, longArr[1].value)
}
fun testBooleanArray() {
assertFalse(booleanArr[1].value)
booleanArr[1].compareAndSet(false, true)
booleanArr[0].lazySet(true)
assertFalse(booleanArr[2].getAndSet(true))
assertTrue(booleanArr[0].value && booleanArr[1].value && booleanArr[2].value)
}
@Suppress("UNCHECKED_CAST")
fun testRefArray() {
val a2 = ANode(BNode(CNode(2)))
val a3 = ANode(BNode(CNode(3)))
refArr[0].value = a2
assertEquals(2, refArr[0].value!!.b.c.d)
assertTrue(refArr[0].compareAndSet(a2, a3))
assertEquals(3, refArr[0].value!!.b.c.d)
val r0 = refArr[0].value
refArr[3].value = r0
assertEquals(3, refArr[3].value!!.b.c.d)
val a = abcNode.value
assertTrue(refArr[3].compareAndSet(a3, a))
}
}
data class ANode<T>(val b: T)
data class BNode<T>(val c: T)
data class CNode(val d: Int)
fun box(): String {
val primitiveTest = TopLevelPrimitiveTest()
primitiveTest.testTopLevelInt()
primitiveTest.testTopLevelLong()
primitiveTest.testTopLevelBoolean()
primitiveTest.testTopLevelRef()
primitiveTest.testTopLevelArrayOfNulls()
val arrayTest = TopLevelArrayTest()
arrayTest.testIntArray()
arrayTest.testLongArray()
arrayTest.testBooleanArray()
arrayTest.testRefArray()
return "OK"
}
@@ -0,0 +1,162 @@
@kotlin.Metadata
public final class ANode {
// source: 'TopLevelTest.kt'
private final field b: java.lang.Object
public method <init>(p0: java.lang.Object): void
public final method component1(): java.lang.Object
public synthetic static method copy$default(p0: ANode, p1: java.lang.Object, p2: int, p3: java.lang.Object): ANode
public final @org.jetbrains.annotations.NotNull method copy(p0: java.lang.Object): ANode
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public final method getB(): java.lang.Object
public method hashCode(): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
}
@kotlin.Metadata
public final class BNode {
// source: 'TopLevelTest.kt'
private final field c: java.lang.Object
public method <init>(p0: java.lang.Object): void
public final method component1(): java.lang.Object
public synthetic static method copy$default(p0: BNode, p1: java.lang.Object, p2: int, p3: java.lang.Object): BNode
public final @org.jetbrains.annotations.NotNull method copy(p0: java.lang.Object): BNode
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public final method getC(): java.lang.Object
public method hashCode(): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
}
@kotlin.Metadata
public final class CNode {
// source: 'TopLevelTest.kt'
private final field d: int
public method <init>(p0: int): void
public final method component1(): int
public synthetic static method copy$default(p0: CNode, p1: int, p2: int, p3: java.lang.Object): CNode
public final @org.jetbrains.annotations.NotNull method copy(p0: int): CNode
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
public final method getD(): int
public method hashCode(): int
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
}
@kotlin.Metadata
public final class TopLevelArrayTest {
// source: 'TopLevelTest.kt'
public method <init>(): void
public final method testBooleanArray(): void
public final method testIntArray(): void
public final method testLongArray(): void
public final method testRefArray(): void
}
@kotlin.Metadata
public final class TopLevelPrimitiveTest {
// source: 'TopLevelTest.kt'
public method <init>(): void
public final method testTopLevelArrayOfNulls(): void
public final method testTopLevelBoolean(): void
public final method testTopLevelInt(): void
public final method testTopLevelLong(): void
public final method testTopLevelRef(): void
}
@kotlin.Metadata
public synthetic final class TopLevelTest$VolatileWrapper$atomicfu$internal {
// source: 'TopLevelTest.kt'
private synthetic final static field a_internal$volatile$FU: java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic volatile field a_internal$volatile: int
private synthetic final static field abcNode_internal$volatile$FU: java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic volatile field abcNode_internal$volatile: java.lang.Object
private synthetic final static field any_internal$volatile$FU: java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic volatile field any_internal$volatile: java.lang.Object
private synthetic final static field b_internal$volatile$FU: java.util.concurrent.atomic.AtomicLongFieldUpdater
private synthetic volatile field b_internal$volatile: long
private synthetic final static field c_internal$volatile$FU: java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic volatile field c_internal$volatile: int
static method <clinit>(): void
private method <init>(): void
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
public synthetic final static method getA_internal$volatile$FU$main(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final method getA_internal$volatile(): int
public synthetic final static method getAbcNode_internal$volatile$FU$main(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic final method getAbcNode_internal$volatile(): java.lang.Object
public synthetic final static method getAny_internal$volatile$FU$main(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic final method getAny_internal$volatile(): java.lang.Object
public synthetic final static method getB_internal$volatile$FU$main(): java.util.concurrent.atomic.AtomicLongFieldUpdater
private synthetic final method getB_internal$volatile(): long
public synthetic final static method getC_internal$volatile$FU$main(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final method getC_internal$volatile(): int
private synthetic final method setA_internal$volatile(p0: int): void
private synthetic final method setAbcNode_internal$volatile(p0: java.lang.Object): void
private synthetic final method setAny_internal$volatile(p0: java.lang.Object): void
private synthetic final method setB_internal$volatile(p0: long): void
private synthetic final method setC_internal$volatile(p0: int): void
}
@kotlin.Metadata
synthetic final class TopLevelTest$VolatileWrapper$atomicfu$private {
// source: 'TopLevelTest.kt'
private synthetic final static field a$volatile$FU: java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic volatile field a$volatile: int
private synthetic final static field abcNode$volatile$FU: java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic volatile field abcNode$volatile: java.lang.Object
private synthetic final static field any$volatile$FU: java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic volatile field any$volatile: java.lang.Object
private synthetic final static field b$volatile$FU: java.util.concurrent.atomic.AtomicLongFieldUpdater
private synthetic volatile field b$volatile: long
private synthetic final static field c$volatile$FU: java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic volatile field c$volatile: int
static method <clinit>(): void
private method <init>(): void
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
public synthetic final static method access$getA$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
public synthetic final static method access$getAbcNode$volatile$FU(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
public synthetic final static method access$getAny$volatile$FU(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
public synthetic final static method access$getB$volatile$FU(): java.util.concurrent.atomic.AtomicLongFieldUpdater
public synthetic final static method access$getC$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final static method getA$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final method getA$volatile(): int
private synthetic final static method getAbcNode$volatile$FU(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic final method getAbcNode$volatile(): java.lang.Object
private synthetic final static method getAny$volatile$FU(): java.util.concurrent.atomic.AtomicReferenceFieldUpdater
private synthetic final method getAny$volatile(): java.lang.Object
private synthetic final static method getB$volatile$FU(): java.util.concurrent.atomic.AtomicLongFieldUpdater
private synthetic final method getB$volatile(): long
private synthetic final static method getC$volatile$FU(): java.util.concurrent.atomic.AtomicIntegerFieldUpdater
private synthetic final method getC$volatile(): int
private synthetic final method setA$volatile(p0: int): void
private synthetic final method setAbcNode$volatile(p0: java.lang.Object): void
private synthetic final method setAny$volatile(p0: java.lang.Object): void
private synthetic final method setB$volatile(p0: long): void
private synthetic final method setC$volatile(p0: int): void
}
@kotlin.Metadata
public final class TopLevelTestKt {
// source: 'TopLevelTest.kt'
private synthetic final static field anyRefArr: java.util.concurrent.atomic.AtomicReferenceArray
private synthetic final static field booleanArr: java.util.concurrent.atomic.AtomicIntegerArray
private synthetic final static field intArr: java.util.concurrent.atomic.AtomicIntegerArray
private synthetic final static field longArr: java.util.concurrent.atomic.AtomicLongArray
private synthetic final static field refArr: java.util.concurrent.atomic.AtomicReferenceArray
private synthetic final static field stringAtomicNullArr: java.util.concurrent.atomic.AtomicReferenceArray
private synthetic final static field topLevelTest$VolatileWrapper$atomicfu$internal: TopLevelTest$VolatileWrapper$atomicfu$internal
private synthetic final static field topLevelTest$VolatileWrapper$atomicfu$private: TopLevelTest$VolatileWrapper$atomicfu$private
static method <clinit>(): void
public synthetic final static method access$getBooleanArr(): java.util.concurrent.atomic.AtomicIntegerArray
public synthetic final static method access$getIntArr(): java.util.concurrent.atomic.AtomicIntegerArray
public synthetic final static method access$getLongArr(): java.util.concurrent.atomic.AtomicLongArray
public synthetic final static method access$getRefArr(): java.util.concurrent.atomic.AtomicReferenceArray
public synthetic final static method access$getStringAtomicNullArr(): java.util.concurrent.atomic.AtomicReferenceArray
public synthetic final static method access$getTopLevelTest$VolatileWrapper$atomicfu$private(): TopLevelTest$VolatileWrapper$atomicfu$private
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
private synthetic final static method getAnyRefArr(): java.util.concurrent.atomic.AtomicReferenceArray
private synthetic final static method getBooleanArr(): java.util.concurrent.atomic.AtomicIntegerArray
private synthetic final static method getIntArr(): java.util.concurrent.atomic.AtomicIntegerArray
private synthetic final static method getLongArr(): java.util.concurrent.atomic.AtomicLongArray
private synthetic final static method getRefArr(): java.util.concurrent.atomic.AtomicReferenceArray
private synthetic final static method getStringAtomicNullArr(): java.util.concurrent.atomic.AtomicReferenceArray
public synthetic final static method getTopLevelTest$VolatileWrapper$atomicfu$internal(): TopLevelTest$VolatileWrapper$atomicfu$internal
private synthetic final static method getTopLevelTest$VolatileWrapper$atomicfu$private(): TopLevelTest$VolatileWrapper$atomicfu$private
}