diff --git a/HISTORY b/HISTORY index 81ec61f..4e4b545 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,6 @@ +May. 15 2017 +Added mb_get_gc_enabled and mb_set_gc_enabled functions + May. 14 2017 Added a clear_parser parameter to the mb_run function Added an extra end of running checking after stepped diff --git a/MY-BASIC Quick Reference.pdf b/MY-BASIC Quick Reference.pdf index 37b9d67..6b26099 100644 Binary files a/MY-BASIC Quick Reference.pdf and b/MY-BASIC Quick Reference.pdf differ diff --git a/core/my_basic.c b/core/my_basic.c index df6f99f..b26ff14 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -393,6 +393,7 @@ typedef struct _gc_t { _ht_node_t* collected_table; _ht_node_t* valid_table; unsigned char collecting; + bool_t enabled_collecting; } _gc_t; typedef struct _calculation_operator_info_t { @@ -6543,6 +6544,10 @@ static void _gc_collect_garbage(mb_interpreter_t* s, int depth) { gc = &s->gc; + /* Check whether it's paused */ + if(!gc->enabled_collecting) + return; + /* Avoid infinity loop */ if(gc->collecting) return; @@ -11300,6 +11305,7 @@ int mb_close(struct mb_interpreter_t** s) { _tidy_scope_chain(*s); _dispose_scope_chain(*s); + (*s)->gc.enabled_collecting = true; _gc_collect_garbage(*s, -1); _ht_destroy((*s)->gc.table); _ht_destroy((*s)->gc.recursive_table); @@ -13610,6 +13616,22 @@ _exit: return result; } +/* Get whether GC is enabled */ +bool_t mb_get_gc_enabled(struct mb_interpreter_t* s) { + if(!s) return false; + + return s->gc.enabled_collecting; +} + +/* Sets whether GC is enabled */ +int mb_set_gc_enabled(struct mb_interpreter_t* s, bool_t gc) { + if(!s) return MB_FUNC_ERR; + + s->gc.enabled_collecting = gc; + + return MB_FUNC_OK; +} + /* Trigger GC */ int mb_gc(struct mb_interpreter_t* s, int_t* collected) { int_t diff = 0; diff --git a/core/my_basic.h b/core/my_basic.h index a924785..ae2efe7 100755 --- a/core/my_basic.h +++ b/core/my_basic.h @@ -667,6 +667,8 @@ MBAPI int mb_set_error_handler(struct mb_interpreter_t* s, mb_error_handler_t h) MBAPI int mb_set_printer(struct mb_interpreter_t* s, mb_print_func_t p); MBAPI int mb_set_inputer(struct mb_interpreter_t* s, mb_input_func_t p); +MBAPI bool_t mb_get_gc_enabled(struct mb_interpreter_t* s); +MBAPI int mb_set_gc_enabled(struct mb_interpreter_t* s, bool_t gc); MBAPI int mb_gc(struct mb_interpreter_t* s, int_t* collected/* = NULL*/); MBAPI int mb_get_userdata(struct mb_interpreter_t* s, void** d); MBAPI int mb_set_userdata(struct mb_interpreter_t* s, void* d);