RUNTIME: laucher uses runtime API for registering and running out initializers

This commit is contained in:
Konstantin Anisimov
2016-12-16 18:19:01 +03:00
committed by vvlevchenko
parent 5f097350ac
commit 801953ec56
3 changed files with 28 additions and 27 deletions
-27
View File
@@ -3,33 +3,6 @@
#include "Natives.h"
#include "Types.h"
//--- Init global variables ---------------------------------------------------//
typedef void (*Initializer)();
struct InitNode;
struct InitNode {
Initializer init;
struct InitNode* next;
};
static struct InitNode initHeadNode;
static struct InitNode* initTailNode = &initHeadNode;
void InitGlobalVariables() {
struct InitNode *currNode = initHeadNode.next;
while(currNode) {
currNode->init();
currNode = currNode->next;
}
}
extern "C" void appendToInitializersTail(struct InitNode *next) {
initTailNode->next = next;
initTailNode = next;
}
//--- Setup args --------------------------------------------------------------//
ObjHeader* setupArgs(int argc, char** argv) {
+19
View File
@@ -31,6 +31,25 @@ void CheckInstance(const ObjHeader* obj, const TypeInfo* type_info) {
ThrowClassCastException();
}
static struct InitNode* initHeadNode = nullptr;
static struct InitNode* initTailNode = nullptr;
void AppendToInitializersTail(struct InitNode *next) {
if (initHeadNode == nullptr) {
initHeadNode = next;
} else {
initTailNode->next = next;
}
initTailNode = next;
}
void InitGlobalVariables() {
struct InitNode *currNode = initHeadNode;
while(currNode != nullptr) {
currNode->init();
currNode = currNode->next;
}
}
#ifdef __cplusplus
}
#endif
+9
View File
@@ -39,6 +39,15 @@ extern const TypeInfo* theThrowableTypeInfo;
KBoolean IsInstance(const ObjHeader* obj, const TypeInfo* type_info);
void CheckCast(const ObjHeader* obj, const TypeInfo* type_info);
typedef void (*Initializer)();
struct InitNode {
Initializer init;
struct InitNode* next;
};
void AppendToInitializersTail(struct InitNode*);
void InitGlobalVariables();
#ifdef __cplusplus
}
#endif