diff --git a/HISTORY b/HISTORY index e1b45a5..ad6f958 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,6 @@ +Mar. 4 2016 +Fixed a memory leak with sub routine parameter + Mar. 2 2016 Added a new YARD sample Fixed a crash bug when unreferencing a garbage diff --git a/core/my_basic.c b/core/my_basic.c index 7748de5..0e72aa9 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -3736,6 +3736,8 @@ static int _proc_args(mb_interpreter_t* s, _ls_node_t** l, _running_context_t* r var->data->ref = true; } + if(!pop_arg && var->data->type == _DT_STRING && !var->data->ref) + _mark_lazy_destroy_string(s, var->data->data.string); result = _public_value_to_internal_object(&arg, var->data); if(result != MB_FUNC_OK) @@ -7073,8 +7075,11 @@ static int _clone_clsss_field(void* data, void* extra, void* n) { case _DT_VAR: var = obj->data.variable; if(!_IS_ME(var)) { + if(_ht_find(instance->scope->var_dict, var->name)) + break; + ret = _duplicate_parameter(var, 0, instance->scope); - _clone_object(instance->ref.s, obj, ret->data.variable->data, false, true); + _clone_object(instance->ref.s, obj, ret->data.variable->data, false, var->data->type != _DT_CLASS); } break; @@ -7084,7 +7089,7 @@ static int _clone_clsss_field(void* data, void* extra, void* n) { ret = _create_object(); ret->type = _DT_ARRAY; ret->ref = false; - _clone_object(instance->ref.s, obj, ret, false, true); + _clone_object(instance->ref.s, obj, ret, false, false); _ht_set_or_insert(instance->scope->var_dict, ret->data.array->name, ret); } diff --git a/output/my_basic.exe b/output/my_basic.exe index 762c919..eeb5a94 100755 Binary files a/output/my_basic.exe and b/output/my_basic.exe differ