ni: adds system to manage native local references to Nit objects
[nit.git] / clib / nit_common.h
index 7e0fce8..b5d8252 100644 (file)
@@ -123,6 +123,29 @@ extern val_t G_sys;
 extern int glob_argc;
 extern char ** glob_argv;
 
+/* Native reference to Nit objects */
+/* This structure is used to represent every Nit type in extern methods and custom C code. */
+struct nitni_ref {
+       val_t val; /* reference to the real Nit object, is kept up-to-date by GC */
+};
+
+/* This structure is used by extern methods to keep track of local references to Nit objects */
+/* These references make sure an object is not collected by the GC while
+ * this extern methods is on the call stack. */
+/* This takes the form of an array link, each link of size 8 to avoid multiple mallocs. */
+#define NITNI_REF_ARRAY_LINK_SIZE 8
+struct nitni_ref_array_link {
+       struct nitni_ref *reg[ NITNI_REF_ARRAY_LINK_SIZE ];
+       int count; /* nubmer of elements in this link */
+       struct nitni_ref_array_link *next; /* next link in the list */
+};
+
+/* Register reference to Nit object with the latest extern method called. */
+extern void nitni_local_ref_add( struct nitni_ref *ref );
+
+/* Clean all references associated to the current (but returning) extern method. */
+extern void nitni_local_ref_clean( void );
+
 /* Stack frames.
  * Are used to:
  * - store local variables (REGS) of functions
@@ -137,8 +160,9 @@ struct stack_frame_t {
        struct stack_frame_t *closure_ctx; /* closure context (for functions that have closure parameters) */
        fun_t *closure_funs; /* closure functions (for functions that have closure parameters) */
        int has_broke; /* has an escape occured? 0 if false, label_idx (>0) if true */
+       struct nitni_ref_array_link *nitni_local_ref_head; /* points to head of array link contaning local variables used via nitni */
        int REG_size; /* number of local variables */
-       val_t REG[1]; /* local variables (flexible array) */
+       val_t REG[1]; /* local variables (flexible array, this must be the last variable is extended in fra struct */
 };
 extern struct stack_frame_t *stack_frame_head;