X-Git-Url: http://nitlanguage.org diff --git a/c_src/nit.common.h b/c_src/nit.common.h index d740f13..ce5af57 100644 --- a/c_src/nit.common.h +++ b/c_src/nit.common.h @@ -1,7 +1,13 @@ #include #include #include -#include +#include "gc_chooser.h" +#ifdef ANDROID + #include + #define PRINT_ERROR(...) (void)__android_log_print(ANDROID_LOG_WARN, "Nit", __VA_ARGS__) +#else + #define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__) +#endif typedef void(*nitmethod_t)(void); /* general C type representing a Nit method. */ typedef union { void* val; @@ -17,49 +23,69 @@ struct type { int id; const char *name; int color; short int is_nullable; const struct instance { const struct type *type; const struct class *class; nitattribute_t attrs[]; }; /* general C type representing a Nit instance. */ struct types { int dummy; const struct type *types[]; }; /* a list types (used for vts, fts and unresolved lists). */ typedef struct instance val; /* general C type representing a Nit instance. */ -extern int glob_argc; -extern char **glob_argv; -extern val *glob_sys; -struct instance_posix__Passwd { -const struct type *type; -const struct class *class; -void* value; +struct nitni_instance { + struct nitni_instance *next, + *prev; /* adjacent global references in global list */ + int count; /* number of time this global reference has been marked */ + struct instance *value; }; -struct instance_posix__Group { -const struct type *type; -const struct class *class; -void* value; + +/* Native reference to Nit objects */ +/* This structure is used to represent every Nit type in extern methods and custom C code. */ +struct nitni_ref { + struct nitni_ref *next, + *prev; /* adjacent global references in global list */ + int count; /* number of time this global reference has been marked */ }; -struct instance_string__NativeString { -const struct type *type; -const struct class *class; -char* value; + +/* List of global references from C code to Nit objects */ +/* Instanciated empty at init of Nit system and filled explicitly by user in C code */ +struct nitni_global_ref_list_t { + struct nitni_ref *head, *tail; }; -val* BOX_string__NativeString(char*); +extern struct nitni_global_ref_list_t *nitni_global_ref_list; + +/* Initializer of global reference list */ +extern void nitni_global_ref_list_init(); + +/* Intern function to add a global reference to the list */ +extern void nitni_global_ref_add( struct nitni_ref *ref ); + +/* Intern function to remove a global reference from the list */ +extern void nitni_global_ref_remove( struct nitni_ref *ref ); + +/* Increase count on an existing global reference */ +extern void nitni_global_ref_incr( struct nitni_ref *ref ); + +/* Decrease count on an existing global reference */ +extern void nitni_global_ref_decr( struct nitni_ref *ref ); + +void show_backtrace(int) __attribute__ ((noreturn)); +#define likely(x) __builtin_expect((x),1) +#define unlikely(x) __builtin_expect((x),0) +extern int glob_argc; +extern char **glob_argv; +extern val *glob_sys; struct instance_kernel__Bool { const struct type *type; const struct class *class; short int value; }; -val* BOX_kernel__Bool(short int); struct instance_kernel__Float { const struct type *type; const struct class *class; double value; }; -val* BOX_kernel__Float(double); struct instance_kernel__Int { const struct type *type; const struct class *class; long value; }; -val* BOX_kernel__Int(long); struct instance_kernel__Char { const struct type *type; const struct class *class; char value; }; -val* BOX_kernel__Char(char); struct instance_kernel__Pointer { const struct type *type; const struct class *class; @@ -68,31 +94,6 @@ void* value; struct instance_array__NativeArray { const struct type *type; const struct class *class; +int length; val* values[0]; }; -struct instance_file__FileStat { -const struct type *type; -const struct class *class; -void* value; -}; -struct instance_file__NativeFile { -const struct type *type; -const struct class *class; -void* value; -}; -val* BOX_file__NativeFile(void*); -struct instance_time__TimeT { -const struct type *type; -const struct class *class; -void* value; -}; -struct instance_time__Tm { -const struct type *type; -const struct class *class; -void* value; -}; -struct instance_exec__NativeProcess { -const struct type *type; -const struct class *class; -void* value; -};