*fixed a wrong scope bug caused by cloned class instance.

This commit is contained in:
paladin-t 2016-01-02 17:58:05 +08:00
parent 2f7f86762b
commit 2dd3ca4d6a
3 changed files with 22 additions and 10 deletions

View File

@ -1,6 +1,8 @@
Jan. 2 2016 Jan. 2 2016
Added support to apply GET statement to a class instance Added support to apply GET statement to a class instance
Added support to access a collection by brackets Added support to access a collection by brackets
Fixed a wrong scope bug caused by cloned class instance
Fixed a GC issue by adding reference count when cloning a collection or a referenced usertype
Fixed a mistake in VAR statement Fixed a mistake in VAR statement
Polished document Polished document

View File

@ -409,6 +409,7 @@ typedef struct _routine_t {
#ifdef MB_ENABLE_CLASS #ifdef MB_ENABLE_CLASS
_class_t* instance; _class_t* instance;
#endif /* MB_ENABLE_CLASS */ #endif /* MB_ENABLE_CLASS */
bool_t is_cloned;
bool_t is_basic; bool_t is_basic;
union { union {
struct { struct {
@ -5748,10 +5749,17 @@ int _clone_clsss_field(void* data, void* extra, void* n) {
case _DT_ROUTINE: case _DT_ROUTINE:
sub = (_routine_t*)obj->data.routine; sub = (_routine_t*)obj->data.routine;
if(!_search_identifier_in_scope_chain(instance->ref.s, instance->scope, sub->name, 0, 0)) { if(!_search_identifier_in_scope_chain(instance->ref.s, instance->scope, sub->name, 0, 0)) {
_routine_t* routine = (_routine_t*)mb_malloc(sizeof(_routine_t));
memset(routine, 0, sizeof(_routine_t));
routine->name = mb_strdup(sub->name, 0);
routine->instance = instance;
routine->is_cloned = true;
routine->is_basic = sub->is_basic;
routine->func = sub->func;
ret = _create_object(); ret = _create_object();
ret->type = _DT_ROUTINE; ret->type = _DT_ROUTINE;
ret->data.routine = sub; ret->data.routine = routine;
ret->ref = true; ret->ref = false;
_ht_set_or_insert(instance->scope->var_dict, obj->data.routine->name, ret); _ht_set_or_insert(instance->scope->var_dict, obj->data.routine->name, ret);
} }
@ -6414,6 +6422,7 @@ int _dispose_object(_object_t* obj) {
case _DT_ROUTINE: case _DT_ROUTINE:
if(!obj->ref) { if(!obj->ref) {
safe_free(obj->data.routine->name); safe_free(obj->data.routine->name);
if(!obj->data.routine->is_cloned) {
if(obj->data.routine->is_basic) { if(obj->data.routine->is_basic) {
if(obj->data.routine->func.basic.scope) { if(obj->data.routine->func.basic.scope) {
if(obj->data.routine->func.basic.scope->var_dict) { if(obj->data.routine->func.basic.scope->var_dict) {
@ -6425,6 +6434,7 @@ int _dispose_object(_object_t* obj) {
if(obj->data.routine->func.basic.parameters) if(obj->data.routine->func.basic.parameters)
_ls_destroy(obj->data.routine->func.basic.parameters); _ls_destroy(obj->data.routine->func.basic.parameters);
} }
}
safe_free(obj->data.routine); safe_free(obj->data.routine);
} }

Binary file not shown.