From 426bf04b817402835bec1a665a2ce66e38f54f32 Mon Sep 17 00:00:00 2001 From: paladin-t Date: Wed, 2 Mar 2016 13:36:03 +0800 Subject: [PATCH] *fixed a crash bug when unreferencing a garbage; *fixed a multiple disposing bug when an error occurs in an expression. --- HISTORY | 4 +++ core/my_basic.c | 73 +++++++++++++++++++++++++++----------------- output/my_basic.exe | Bin 365568 -> 366592 bytes shell/main.c | 4 +++ 4 files changed, 53 insertions(+), 28 deletions(-) diff --git a/HISTORY b/HISTORY index 663f219..7563318 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,7 @@ +Mar. 2 2016 +Fixed a crash bug when unreferencing a garbage +Fixed a multiple disposing bug when an error occurs in an expression + Mar. 1 2016 Added an OS statement Fixed a variable pathing bug in lambda diff --git a/core/my_basic.c b/core/my_basic.c index 5f50c6b..191a9f4 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -1466,7 +1466,7 @@ static void _create_ref(_ref_t* ref, _unref_func_t dtor, _data_e t, mb_interpret static void _destroy_ref(_ref_t* ref); static void _gc_add(_ref_t* ref, void* data, _gc_t* gc); -static void _gc_remove(_ref_t* ref, void* data); +static void _gc_remove(_ref_t* ref, void* data, _gc_t* gc); static int _gc_add_reachable(void* data, void* extra, void* h); static void _gc_get_reachable(mb_interpreter_t* s, _ht_node_t* ht); static int _gc_destroy_garbage_in_list(void* data, void* extra, _gc_t* gc); @@ -1632,6 +1632,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 _remove_if_exist(void* data, void* extra, _ls_node_t* ls); 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); @@ -3278,7 +3279,7 @@ _array: ast = ast->prev; result = _get_array_index(s, &ast, c, &arr_idx, 0); if(result != MB_FUNC_OK) { - _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } ast = ast->next; _get_array_elem(s, c->data.array, arr_idx, &arr_val, &arr_type); @@ -3288,7 +3289,7 @@ _array: arr_elem->ref = true; _copy_bytes(arr_elem->data.bytes, arr_val.bytes); if(f) { - _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } _ls_pushback(opnd, arr_elem); f++; @@ -3310,7 +3311,7 @@ _array: running->calc_depth = calc_depth; } if(result != MB_FUNC_OK) { - _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } c = _create_object(); _ls_pushback(garbage, c); @@ -3318,15 +3319,15 @@ _array: if(c->type == _DT_STRING) c->ref = true; if(result != MB_FUNC_OK) - goto _exit; + goto _error; if(f) { - _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } if(_is_array(c)) { goto _array; } else { if(ast && _IS_FUNC(ast->data, _core_open_bracket)) { - _handle_error_on_obj(s, SE_RN_SYNTAX, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_SYNTAX, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } } _ls_pushback(opnd, c); @@ -3364,15 +3365,15 @@ _routine: if(ast) ast = ast->prev; if(result != MB_FUNC_OK) { - _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } c = _create_object(); _ls_pushback(garbage, c); result = _public_value_to_internal_object(&running->intermediate_value, c); if(result != MB_FUNC_OK) - goto _exit; + goto _error; if(f) { - _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } _ls_pushback(opnd, c); f++; @@ -3390,7 +3391,7 @@ _routine: ast = ast->prev; result = _get_array_index(s, &ast, 0, &arr_idx, 0); if(result != MB_FUNC_OK) { - _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_CALCULATION_ERROR, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } ast = ast->next; _get_array_elem(s, c->data.variable->data->data.array, arr_idx, &arr_val, &arr_type); @@ -3410,7 +3411,7 @@ _routine: mb_assert(0 && "Unsupported."); } if(f) { - _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } _ls_pushback(opnd, arr_elem); f++; @@ -3457,7 +3458,7 @@ _var: case _DT_LIST: mb_check(mb_pop_int(s, (void**)l, &idx)); if(!_at_list(ocoll->data.list, idx, &ret)) { - _handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, TON(l), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, TON(l), MB_FUNC_ERR, _error, result); } break; @@ -3465,7 +3466,7 @@ _var: mb_make_nil(key); mb_check(mb_pop_value(s, (void**)l, &key)); if(!_find_dict(ocoll->data.dict, &key, &ret)) { - _handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, TON(l), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, TON(l), MB_FUNC_ERR, _error, result); } break; @@ -3486,13 +3487,13 @@ _var: } #endif /* MB_ENABLE_COLLECTION_LIB */ if(_IS_FUNC(_err_or_bracket, _core_open_bracket)) { - _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } } while(0); } } if(f) { - _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_OPERATOR_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } _ls_pushback(opnd, c); f++; @@ -3504,7 +3505,7 @@ _var: if(c->type == _DT_FUNC && !_is_operator(c->data.func->pointer) && !_is_flow(c->data.func->pointer)) { _ls_foreach(opnd, _remove_source_object); - _handle_error_on_obj(s, SE_RN_COLON_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_COLON_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _error, result); } ast = ast->next; } else { @@ -3534,7 +3535,7 @@ _var: r = _operate_operand(s, theta, a, b, &result); if(!r) { _ls_clear(optr); - _handle_error_on_obj(s, SE_RN_OPERATION_FAILED, s->source_file, DON(errn), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_OPERATION_FAILED, s->source_file, DON(errn), MB_FUNC_ERR, _error, result); } _ls_pushback(opnd, r); _ls_pushback(garbage, r); @@ -3547,7 +3548,7 @@ _var: } if(errn) { - _handle_error_on_obj(s, SE_RN_CLOSE_BRACKET_EXPECTED, s->source_file, DON(errn), MB_FUNC_ERR, _exit, result); + _handle_error_on_obj(s, SE_RN_CLOSE_BRACKET_EXPECTED, s->source_file, DON(errn), MB_FUNC_ERR, _error, result); } c = (_object_t*)(_ls_popback(opnd)); @@ -3569,7 +3570,7 @@ _var: _set_current_error(s, SE_RN_INVALID_DATA_TYPE, 0); result = MB_FUNC_ERR; - goto _exit; + goto _error; } if(c->type == _DT_VAR) { (*val)->type = c->data.variable->data->type; @@ -3611,6 +3612,10 @@ _var: } } + while(0) { +_error: + _LS_FOREACH(garbage, _do_nothing_on_object, _remove_if_exist, opnd); + } _exit: _LS_FOREACH(garbage, _destroy_object, _try_clear_intermediate_value, s); _ls_destroy(garbage); @@ -5329,15 +5334,17 @@ static _ref_count_t _ref(_ref_t* ref, void* data) { static bool_t _unref(_ref_t* ref, void* data) { /* Decrease the reference of a stub by 1 */ bool_t result = true; + _gc_t* gc = 0; + gc = &ref->s->gc; result = --(*ref->count) == _NONE_REF; mb_assert(*ref->count >= _NONE_REF); _gc_add(ref, data, &ref->s->gc); if(ref->count && *ref->count == _NONE_REF) _tidy_intermediate_value(ref, data); ref->on_unref(ref, data); - if(!ref->count) - _gc_remove(ref, data); + if(result) + _gc_remove(ref, data, gc); return result; } @@ -5425,16 +5432,16 @@ static void _gc_add(_ref_t* ref, void* data, _gc_t* gc) { _ht_remove(table, ref, 0); } -static void _gc_remove(_ref_t* ref, void* data) { +static void _gc_remove(_ref_t* ref, void* data, _gc_t* gc) { /* Remove a referenced object from GC */ _ht_node_t* table = 0; - mb_assert(ref && data); + mb_assert(ref && data && gc); - if(ref->s->gc.collecting) - table = ref->s->gc.recursive_table; + if(gc->collecting) + table = gc->recursive_table; else - table = ref->s->gc.table; + table = gc->table; if(table) _ht_remove(table, ref, 0); @@ -8896,6 +8903,15 @@ static void _try_clear_intermediate_value(void* data, void* extra, mb_interprete } } +static void _remove_if_exist(void* data, void* extra, _ls_node_t* ls) { + /* Remove from another list if exist */ + _object_t* obj = 0; + mb_unrefvar(extra); + + obj = (_object_t*)data; + _ls_try_remove(ls, obj, _ls_cmp_data, 0); +} + static void _destroy_lazy_objects(mb_interpreter_t* s) { /* Destroy lazy releasing objects */ _ls_foreach(s->lazy_destroy_objects, _destroy_object); @@ -12918,7 +12934,8 @@ _elseif: _exit: if(result == MB_SUB_RETURN) { - ast = ast->prev; + if(ast) + ast = ast->prev; } else { if(multi_line) { int ret = MB_FUNC_OK; diff --git a/output/my_basic.exe b/output/my_basic.exe index 2919af1a1d805dfce6cf1df9b32688a503fe3925..4005932a1821bd0c6994e300fc9908d02e083d84 100755 GIT binary patch delta 33496 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 c)HPceJ2}jx5dw|G_}J20M7e3zW@LL delta 33182 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 PD{8;6O>yDSHt7EVc~IwR diff --git a/shell/main.c b/shell/main.c index bd72d71..c993d37 100755 --- a/shell/main.c +++ b/shell/main.c @@ -86,6 +86,7 @@ extern "C" { /* Define as 1 to use memory pool, 0 to disable */ #define _USE_MEM_POOL 1 +#define _RESET_WHEN_PUSH_TO_POOL 1 #define _MAX_LINE_LENGTH 256 #define _str_eq(__str1, __str2) (mb_stricmp((__str1), (__str2)) == 0) @@ -357,6 +358,9 @@ static void _push_mem(char* p) { } alloc_bytes -= _POOL_NODE_SIZE(p); +#if _RESET_WHEN_PUSH_TO_POOL + memset(p, 0, _POOL_NODE_SIZE(p)); +#endif /* _RESET_WHEN_PUSH_TO_POOL */ if(pool_count) { for(i = 0; i < pool_count; i++) { pl = &pool[i];