nitc: fix calling extern constructors from extern code in separate compiler
[nit.git] / c_src / nith.main.1.c
1 #include "nith.main.0.h"
2 struct nitni_global_ref_list_t *nitni_global_ref_list;
3 void initialize_nitni_global_refs() {
4 nitni_global_ref_list = (struct nitni_global_ref_list_t*)nit_alloc(sizeof(struct nitni_global_ref_list_t));
5 nitni_global_ref_list->head = NULL;
6 nitni_global_ref_list->tail = NULL;
7 }
8
9 void nitni_global_ref_add( struct nitni_ref *ref ) {
10 if ( nitni_global_ref_list->head == NULL ) {
11 nitni_global_ref_list->head = ref;
12 ref->prev = NULL;
13 } else {
14 nitni_global_ref_list->tail->next = ref;
15 ref->prev = nitni_global_ref_list->tail;
16 }
17 nitni_global_ref_list->tail = ref;
18
19 ref->next = NULL;
20 }
21
22 void nitni_global_ref_remove( struct nitni_ref *ref ) {
23 if ( ref->prev == NULL ) {
24 nitni_global_ref_list->head = ref->next;
25 } else {
26 ref->prev->next = ref->next;
27 }
28
29 if ( ref->next == NULL ) {
30 nitni_global_ref_list->tail = ref->prev;
31 } else {
32 ref->next->prev = ref->prev;
33 }
34 }
35
36 extern void nitni_global_ref_incr( struct nitni_ref *ref ) {
37 if ( ref->count == 0 ) /* not registered */
38 {
39 /* add to list */
40 nitni_global_ref_add( ref );
41 }
42
43 ref->count ++;
44 }
45
46 extern void nitni_global_ref_decr( struct nitni_ref *ref ) {
47 if ( ref->count == 1 ) /* was last reference */
48 {
49 /* remove from list */
50 nitni_global_ref_remove( ref );
51 }
52
53 ref->count --;
54 }
55
56 #include <signal.h>
57 #define UNW_LOCAL_ONLY
58 #include <libunwind.h>
59 #include "c_functions_hash.h"
60 int glob_argc;
61 char **glob_argv;
62 val *glob_sys;
63 void sig_handler(int signo){
64 PRINT_ERROR("Caught signal : %s\n", strsignal(signo));
65 show_backtrace(signo);
66 }
67 void show_backtrace (int signo) {
68 char* opt = getenv("NIT_NO_STACK");
69 unw_cursor_t cursor;
70 if(opt==NULL){
71 unw_context_t uc;
72 unw_word_t ip;
73 char* procname = malloc(sizeof(char) * 100);
74 unw_getcontext(&uc);
75 unw_init_local(&cursor, &uc);
76 PRINT_ERROR("-------------------------------------------------\n");
77 PRINT_ERROR("-- Stack Trace ------------------------------\n");
78 PRINT_ERROR("-------------------------------------------------\n");
79 while (unw_step(&cursor) > 0) {
80 unw_get_proc_name(&cursor, procname, 100, &ip);
81 const char* recv = get_nit_name(procname, strlen(procname));
82 if (recv != NULL){
83 PRINT_ERROR("` %s\n", recv);
84 }else{
85 PRINT_ERROR("` %s\n", procname);
86 }
87 }
88 PRINT_ERROR("-------------------------------------------------\n");
89 free(procname);
90 }
91 exit(signo);
92 }
93 int main(int argc, char** argv) {
94 val* var /* : Sys */;
95 signal(SIGABRT, sig_handler);
96 signal(SIGFPE, sig_handler);
97 signal(SIGILL, sig_handler);
98 signal(SIGINT, sig_handler);
99 signal(SIGTERM, sig_handler);
100 signal(SIGSEGV, sig_handler);
101 signal(SIGPIPE, sig_handler);
102 glob_argc = argc; glob_argv = argv;
103 initialize_gc_option();
104 initialize_nitni_global_refs();
105 var = NEW_kernel__Sys(&type_kernel__Sys);
106 glob_sys = var;
107 {
108 ((void (*)(val*))(var->class->vft[COLOR_kernel__Object__init]))(var) /* init on <var:Sys>*/;
109 }
110 {
111 ((void (*)(val*))(var->class->vft[COLOR_kernel__Sys__run]))(var) /* run on <var:Sys>*/;
112 }
113 return 0;
114 }
115 void gc_finalize (void *obj, void *client_data) {
116 val* var /* : Finalizable */;
117 var = obj;
118 {
119 ((void (*)(val*))(var->class->vft[COLOR_gc__Finalizable__finalize]))(var) /* finalize on <var:Finalizable>*/;
120 }
121 }