From 9c9bb57d33d2a7416da53a78d483fdd64902d83c Mon Sep 17 00:00:00 2001 From: Wang Renxin Date: Tue, 13 Oct 2015 17:10:04 +0800 Subject: [PATCH] *fixed a memory leak. --- core/my_basic.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/core/my_basic.c b/core/my_basic.c index 3193a97..c04895e 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -996,6 +996,24 @@ static bool_t _invalid_dict_it(_dict_it_t* it); static bool_t _assign_with_it(_object_t* tgt, _object_t* src); static int _clone_to_list(void* data, void* extra, _list_t* coll); static int _clone_to_dict(void* data, void* extra, _dict_t* coll); +#define _UNREF_COLL(__o) \ + case _DT_LIST: \ + _unref(&(__o)->data.list->ref, (__o)->data.list); \ + break; \ + case _DT_DICT: \ + _unref(&(__o)->data.dict->ref, (__o)->data.dict); \ + break; +#define _UNREF_ARRAY(__o) \ + case _DT_ARRAY: \ + if(!(__o)->ref) \ + _unref(&(__o)->data.array->ref, (__o)->data.array); \ + break; +#define _UNREF_IF_IS_COLL(__o) \ + switch((__o)->type) { \ + _UNREF_COLL(__o) \ + _UNREF_ARRAY(__o) \ + default: break; \ + } #endif /* MB_ENABLE_COLLECTION_LIB */ static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj); static bool_t _unlock_ref_object(_lock_t* lk, _ref_t* ref, void* obj); @@ -5030,17 +5048,10 @@ int _dispose_object(_object_t* obj) { break; #ifdef MB_ENABLE_COLLECTION_LIB - case _DT_LIST: - _unref(&obj->data.list->ref, obj->data.list); - - break; + _UNREF_COLL(obj) case _DT_LIST_IT: _destroy_list_it(obj->data.list_it); - break; - case _DT_DICT: - _unref(&obj->data.dict->ref, obj->data.dict); - break; case _DT_DICT_IT: _destroy_dict_it(obj->data.dict_it); @@ -5551,14 +5562,7 @@ void _assign_public_value(mb_value_t* tgt, mb_value_t* src) { break; #ifdef MB_ENABLE_COLLECTION_LIB - case _DT_LIST: - _unref(&obj.data.list->ref, obj.data.list); - - break; - case _DT_DICT: - _unref(&obj.data.dict->ref, obj.data.dict); - - break; + _UNREF_COLL(&obj) #endif /* MB_ENABLE_COLLECTION_LIB */ default: /* Do nothing */ break; @@ -9626,6 +9630,7 @@ int _coll_pop(mb_interpreter_t* s, void** l) { mb_value_t lst; mb_value_t val; _object_t olst; + _object_t ocoll; mb_assert(s && l); @@ -9642,6 +9647,8 @@ int _coll_pop(mb_interpreter_t* s, void** l) { _public_value_to_internal_object(&lst, &olst); if(_pop_list(olst.data.list, &val, s)) { mb_check(mb_push_value(s, l, val)); + _public_value_to_internal_object(&val, &ocoll); + _UNREF_IF_IS_COLL(&ocoll); _assign_public_value(&lst, 0); } else {