ni: adds global references to Nit objects from C code
[nit.git] / clib / gc.c
index 2cb8675..ad051d9 100644 (file)
--- a/clib/gc.c
+++ b/clib/gc.c
@@ -146,6 +146,7 @@ static void GC_collect(void) {
        struct stack_frame_t *frame = stack_frame_head;
        GC_static_object *staticObject = staticObjects.top;
        val_t object;
+       struct nitni_ref *global_ref;
        struct nitni_ref_array_link *local_ref_array_link; /* for native interface */
 
        gc_allocation_pointer = gc_heap_pointer;
@@ -160,6 +161,16 @@ static void GC_collect(void) {
                staticObject = staticObject->next;
        }
 
+       /* Process global reference to Nit objects from C code */
+       global_ref = nitni_global_ref_list->head;
+       while (global_ref != NULL) {
+               object = global_ref->val;
+               if (!ISNULL(object) && ISOBJ(object)) {
+                       global_ref->val = GC_evacuation((obj_t)object);
+               }
+               global_ref = global_ref->next;
+       }
+
        /* Process function frames (local variables) */
        while (frame != NULL) {
                for (j = 0; j < frame->REG_size; j++) {