[KxSerialization] Fix "IllegalAccessError: Update to static final field"

Fixes #KT-57647

For value classes, if you add code to companion anonymous init block in IR, it will be executed in the instance constructor. This causes an error when initializing static fields, because writing to them can only occur from the <clinit> method.

The solution is to transfer the static field initialization code from an anonymous init block to the IR initializer of this field

Merge-request: KT-MR-9633
Merged-by: Sergey Shanshin <Sergey.Shanshin@jetbrains.com>
This commit is contained in:
Sergey.Shanshin
2023-04-21 12:37:32 +00:00
committed by Space Team
parent 803a11003f
commit d8d643b7d7
11 changed files with 126 additions and 19 deletions
@@ -48,6 +48,10 @@ fun main(args: Array<String>) {
model("boxIr")
}
testClass<AbstractSerializationJdk11IrBoxTest> {
model("jdk11BoxIr")
}
testClass<AbstractSerializationFirLightTreeBlackBoxTest> {
model("boxIr")
model("firMembers")
@@ -19,6 +19,13 @@ open class AbstractSerializationIrBoxTest : AbstractIrBlackBoxCodegenTest() {
}
}
open class AbstractSerializationJdk11IrBoxTest : AbstractIrBlackBoxCodegenTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureForKotlinxSerialization(useJdk11 = true)
}
}
open class AbstractSerializationWithoutRuntimeIrBoxTest : AbstractIrBlackBoxCodegenTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
@@ -8,17 +8,18 @@ package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.test.bind
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.runners.codegen.configureModernJavaTest
import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
import org.jetbrains.kotlin.test.services.RuntimeClasspathProvider
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationIntrinsicsState
import org.jetbrains.kotlinx.serialization.compiler.fir.FirSerializationExtensionRegistrar
import java.io.File
private val librariesPaths = listOfNotNull(RuntimeLibraryInClasspathTest.coreLibraryPath, RuntimeLibraryInClasspathTest.jsonLibraryPath)
@@ -57,10 +58,15 @@ class SerializationRuntimeClasspathJsProvider(testServices: TestServices) : Runt
fun TestConfigurationBuilder.configureForKotlinxSerialization(
noLibraries: Boolean = false,
target: TargetBackend = TargetBackend.JVM
target: TargetBackend = TargetBackend.JVM,
useJdk11: Boolean = false
) {
useConfigurators(::SerializationEnvironmentConfigurator.bind(noLibraries))
if (useJdk11) {
configureModernJavaTest(TestJdkKind.FULL_JDK_11, JvmTarget.JVM_11)
}
if (!noLibraries) {
when (target) {
TargetBackend.JVM, TargetBackend.JVM_IR -> useCustomRuntimeClasspathProviders(::SerializationRuntimeClasspathJvmProvider)