diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index df2b2bbb917..7fafff95383 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -826,6 +826,10 @@ task lambda13(type: RunKonanTest) { } task initializers2(type: RunKonanTest) { - goldValue = "1\nA\nB\n" + goldValue = "init globalValue2\n" + + "init globalValue3\n" + + "1\n" + + "globalValue2\n" + + "globalValue3\n" source = "runtime/basic/initializers2.kt" } diff --git a/backend.native/tests/main.c b/backend.native/tests/main.c index ba6c5429eb1..fe2f5864e5e 100644 --- a/backend.native/tests/main.c +++ b/backend.native/tests/main.c @@ -19,7 +19,12 @@ void * resolve_symbol(char *name) { return symbol; } +extern void InitMemory(); +extern void InitGlobalVariables(); + int main() { + InitMemory(); + InitGlobalVariables(); exit(run_test()); } diff --git a/backend.native/tests/runtime/basic/initializers2.kt b/backend.native/tests/runtime/basic/initializers2.kt new file mode 100644 index 00000000000..51ccc478c14 --- /dev/null +++ b/backend.native/tests/runtime/basic/initializers2.kt @@ -0,0 +1,17 @@ +class A(val msg: String) { + init { + println("init $msg") + } + override fun toString(): String = msg +} + +val globalValue1 = 1 +val globalValue2 = A("globalValue2") +val globalValue3 = A("globalValue3") + +fun main(args: Array) { + println(globalValue1.toString()) + println(globalValue2.toString()) + println(globalValue3.toString()) +} + diff --git a/runtime/src/launcher/cpp/launcher.cpp b/runtime/src/launcher/cpp/launcher.cpp index 8a0ed935ecf..597bd15d94f 100644 --- a/runtime/src/launcher/cpp/launcher.cpp +++ b/runtime/src/launcher/cpp/launcher.cpp @@ -13,8 +13,9 @@ struct InitNode { struct InitNode* next; }; -struct InitNode initHeadNode; -struct InitNode* initTailNode = &initHeadNode; +static struct InitNode initHeadNode; +static struct InitNode* initTailNode = &initHeadNode; + void InitGlobalVariables() { struct InitNode *currNode = initHeadNode.next; @@ -24,6 +25,11 @@ void InitGlobalVariables() { } } +extern "C" void appendToInitializersTail(struct InitNode *next) { + initTailNode->next = next; + initTailNode = next; +} + //--- Setup args --------------------------------------------------------------// ObjHeader* setupArgs(int argc, char** argv) {