From 82946437d8537ea78ee90b6d8002d5e3261287a7 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 13 Apr 2016 12:12:41 +0300 Subject: [PATCH] EA-81358: use volatile store / volatile load to guarantee publication of deferred clinit results --- .../kotlin/codegen/MultifileClassPartCodegen.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index bf4e7244272..1c372db5961 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -93,18 +93,24 @@ class MultifileClassPartCodegen( if (requiresDeferredStaticInitialization) { staticInitClassBuilder.apply { + newField(OtherOrigin(packageFragment), Opcodes.ACC_STATIC or Opcodes.ACC_PRIVATE or Opcodes.ACC_VOLATILE, + CLINIT_SYNC_NAME, "I", null, null) + newSpecialMethod(packageFragment, CLINIT_TRIGGER_NAME).apply { visitCode() + visitFieldInsn(Opcodes.GETSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") visitInsn(Opcodes.RETURN) - visitMaxs(0, 0) + visitMaxs(1, 0) visitEnd() } newSpecialMethod(packageFragment, "").apply { visitCode() visitMethodInsn(Opcodes.INVOKESTATIC, partType.internalName, DEFERRED_PART_CLINIT_NAME, "()V", false) + visitInsn(Opcodes.ICONST_0) + visitFieldInsn(Opcodes.PUTSTATIC, staticInitClassType.internalName, CLINIT_SYNC_NAME, "I") visitInsn(Opcodes.RETURN) - visitMaxs(0, 0) + visitMaxs(1, 0) visitEnd() } } @@ -187,6 +193,7 @@ class MultifileClassPartCodegen( private val STATIC_INIT_CLASS_SUFFIX = "__Clinit" private val CLINIT_TRIGGER_NAME = "\$\$clinitTrigger" + private val CLINIT_SYNC_NAME = "\$\$clinitSync" private val DEFERRED_PART_CLINIT_NAME = "\$\$clinit" @JvmStatic fun isStaticInitTrigger(insn: AbstractInsnNode) =