From 91ad8cd2262d92576c238750a5f62a689d94eb1d Mon Sep 17 00:00:00 2001 From: Wang Renxin Date: Sun, 5 Nov 2017 21:01:57 +0800 Subject: [PATCH] *fixed a gc bug with routine in a collection. --- HISTORY | 1 + core/my_basic.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/HISTORY b/HISTORY index 698fdf8..8634372 100755 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,7 @@ Nov. 5 2017 Fixed a GC bug with upvalues in a closure Fixed a GC bug with retrieved routine +Fixed a GC bug with routine in a collection Fixed a crash bug with conflicting routine and class identifier Fixed a dangling pointer bug with incomplete structures Fixed a memory leak with wrong routine or class identifier diff --git a/core/my_basic.c b/core/my_basic.c index a3f2e8d..bc9eaf5 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -1644,6 +1644,11 @@ static void _real_to_str(real_t r, char* str, size_t size, size_t afterpoint); else if((__r) && !(__o)->is_ref && (__o)->data.routine->type != MB_RT_LAMBDA) \ _dispose_object(__o); \ break; +# define _COLL_ROUTINE(__o) \ + do { \ + if((__o)->type == _DT_ROUTINE && (__o)->data.routine->type != MB_RT_LAMBDA) \ + (__o)->is_ref = true; \ + } while(0) #else /* MB_ENABLE_LAMBDA */ # define _REF_ROUTINE(__o) case _DT_ROUTINE: { (void)(__o); } break; # define _UNREF_ROUTINE(__o) case _DT_ROUTINE: { (void)(__o); } break; @@ -1653,6 +1658,11 @@ static void _real_to_str(real_t r, char* str, size_t size, size_t afterpoint); ((void)(__r)); \ _dispose_object(__o); \ break; +# define _COLL_ROUTINE(__o) \ + do { \ + if((__o)->type == _DT_ROUTINE) \ + (__o)->is_ref = true; \ + } while(0) #endif /* MB_ENABLE_LAMBDA */ #define _ADDGC_STRING(__o) \ case _DT_STRING: \ @@ -7448,6 +7458,7 @@ static bool_t _push_list(_list_t* coll, mb_value_t* val, _object_t* oarg) { if(val && !oarg) _create_internal_object_from_public_value(val, &oarg); + _COLL_ROUTINE(oarg); _ls_pushback(coll->list, oarg); coll->count++; @@ -7497,6 +7508,7 @@ static bool_t _insert_list(_list_t* coll, int_t idx, mb_value_t* val, _object_t* _fill_ranged(coll); _create_internal_object_from_public_value(val, &oarg); + _COLL_ROUTINE(oarg); if(oval) *oval = oarg; @@ -7529,6 +7541,7 @@ static bool_t _set_list(_list_t* coll, int_t idx, mb_value_t* val, _object_t** o _destroy_object(result->data, 0); if(val) { _create_internal_object_from_public_value(val, &oarg); + _COLL_ROUTINE(oarg); if(oval) *oval = oarg; } else { @@ -7751,6 +7764,8 @@ static bool_t _set_dict(_dict_t* coll, mb_value_t* key, mb_value_t* val, _object exists = _ht_find(coll->dict, okey); if(exists) _ht_remove(coll->dict, okey, _ls_cmp_extra_object); + _COLL_ROUTINE(okey); + _COLL_ROUTINE(oval); _ht_set_or_insert(coll->dict, okey, oval); _write_on_ref_object(&coll->lock, &coll->ref, coll);