From 147c7d2c3e15e150a3e07cdf9484ca43f4f33214 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Thu, 14 Feb 2019 12:42:36 +0300 Subject: [PATCH] Init runtime on singleton objects access in C interop. (#2658) --- .../src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt | 2 ++ backend.native/tests/produce_dynamic/simple/main.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt index 55d2834223f..c6b249a668f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt @@ -349,6 +349,7 @@ private class ExportedElement(val kind: ElementKind, |extern "C" KObjHeader* ${cname}_instance(KObjHeader**); |static $objectClassC ${cname}_instance_impl(void) { | KObjHolder result_holder; + | Kotlin_initRuntimeIfNeeded(); | KObjHeader* result = ${cname}_instance(result_holder.slot()); | return $objectClassC { .pinned = CreateStablePointer(result)}; |} @@ -366,6 +367,7 @@ private class ExportedElement(val kind: ElementKind, |extern "C" KObjHeader* $cname(KObjHeader**); |static $enumClassC ${cname}_impl(void) { | KObjHolder result_holder; + | Kotlin_initRuntimeIfNeeded(); | KObjHeader* result = $cname(result_holder.slot()); | return $enumClassC { .pinned = CreateStablePointer(result)}; |} diff --git a/backend.native/tests/produce_dynamic/simple/main.c b/backend.native/tests/produce_dynamic/simple/main.c index 3c6f59d09d2..76b3ef980f7 100644 --- a/backend.native/tests/produce_dynamic/simple/main.c +++ b/backend.native/tests/produce_dynamic/simple/main.c @@ -6,6 +6,7 @@ #define CAST(T, v) testlib_kref_ ## T { .pinned = v } int main(void) { + T_(Singleton) singleton = __ kotlin.root.Singleton._instance(); T_(Base) base = __ kotlin.root.Base.Base(); T_(Child) child = __ kotlin.root.Child.Child(); T_(Impl1) impl1 = __ kotlin.root.Impl1.Impl1(); @@ -15,7 +16,6 @@ int main(void) { T_(I) casted_impl2 = { .pinned = impl2.pinned }; T_(Enum) enum1 = __ kotlin.root.Enum.HUNDRED.get(); T_(Codeable) object1 = __ kotlin.root.get_an_object(); - T_(Singleton) singleton = __ kotlin.root.Singleton._instance(); const char* string1 = __ kotlin.root.getString(); const char* string2 = __ kotlin.root.Singleton.toString(singleton);