From 64a888db988ff8b0621620311e69e1f6d62ddf1e Mon Sep 17 00:00:00 2001 From: Wang Renxin Date: Mon, 11 Jan 2016 14:34:15 +0800 Subject: [PATCH] *fixed a memory leak with string manipulation. --- HISTORY | 1 + core/my_basic.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/HISTORY b/HISTORY index 739009d..a118bfb 100755 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,6 @@ Jan. 11 2016 Fixed a crash bug when a DO-UNTIL statement is the end of a program +Fixed a memory leak with string manipulation Jan. 9 2016 Developing lambda, improved error handling diff --git a/core/my_basic.c b/core/my_basic.c index 6bb97fe..188e3eb 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -1457,6 +1457,7 @@ static int _internal_object_to_public_value(_object_t* itn, mb_value_t* pbl); static int _create_internal_object_from_public_value(mb_value_t* pbl, _object_t** itn); static int _compare_public_value_and_internal_object(mb_value_t* pbl, _object_t* itn); static void _try_clear_intermediate_value(void* data, void* extra, mb_interpreter_t* s); +static void _destroy_lazy_objects(mb_interpreter_t* s); static void _mark_lazy_destroy_string(mb_interpreter_t* s, char* ch); static void _assign_public_value(mb_value_t* tgt, mb_value_t* src); static void _swap_public_value(mb_value_t* tgt, mb_value_t* src); @@ -7528,6 +7529,12 @@ void _try_clear_intermediate_value(void* data, void* extra, mb_interpreter_t* s) } } +void _destroy_lazy_objects(mb_interpreter_t* s) { + /* Destroy lazy objects */ + _ls_foreach(s->lazy_destroy_objects, _destroy_object); + _ls_clear(s->lazy_destroy_objects); +} + void _mark_lazy_destroy_string(mb_interpreter_t* s, char* ch) { /* Mark a string as lazy destroy */ _object_t* temp_obj = 0; @@ -7865,6 +7872,8 @@ _retry: } _exit: + _destroy_lazy_objects(s); + *l = ast; _stepped(s, ast); @@ -9930,8 +9939,6 @@ int mb_run(struct mb_interpreter_t* s) { do { result = _execute_statement(s, &ast); - _ls_foreach(s->lazy_destroy_objects, _destroy_object); - _ls_clear(s->lazy_destroy_objects); if(result != MB_FUNC_OK && result != MB_SUB_RETURN) { if(result != MB_FUNC_SUSPEND && s->error_handler) { if(result >= MB_EXTENDED_ABORT)