[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
@@ -111,14 +111,4 @@ abstract class AbstractJvmBlackBoxCodegenTestBase<R : ResultingArtifact.Frontend
enableMetaInfoHandler()
}
private fun TestConfigurationBuilder.configureModernJavaTest(jdkKind: TestJdkKind, jvmTarget: JvmTarget) {
defaultDirectives {
JDK_KIND with jdkKind
JVM_TARGET with jvmTarget
+WITH_STDLIB
+USE_JAVAC_BASED_ON_JVM_TARGET
+IGNORE_DEXING
}
}
}
@@ -5,14 +5,19 @@
package org.jetbrains.kotlin.test.runners.codegen
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.HandlersStepBuilder
import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.test.backend.handlers.*
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.builders.*
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_SMAP
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.RUN_DEX_CHECKER
import org.jetbrains.kotlin.test.directives.ConfigurationDirectives
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact
import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
@@ -188,3 +193,13 @@ fun HandlersStepBuilder<BinaryArtifacts.Jvm>.inlineHandlers() {
::SMAPDumpHandler
)
}
fun TestConfigurationBuilder.configureModernJavaTest(jdkKind: TestJdkKind, jvmTarget: JvmTarget) {
defaultDirectives {
JvmEnvironmentConfigurationDirectives.JDK_KIND with jdkKind
JvmEnvironmentConfigurationDirectives.JVM_TARGET with jvmTarget
+ConfigurationDirectives.WITH_STDLIB
+CodegenTestDirectives.USE_JAVAC_BASED_ON_JVM_TARGET
+CodegenTestDirectives.IGNORE_DEXING
}
}