From c5edb2b1f2b299adc211d32b2bcd8126f640925c Mon Sep 17 00:00:00 2001 From: paladin-t Date: Fri, 29 Jan 2016 19:55:54 +0800 Subject: [PATCH] *fixed lookup bugs with member sub routine of a class instance. --- HISTORY | 2 +- core/my_basic.c | 26 ++++++++++++++++++++++---- output/my_basic.exe | Bin 357888 -> 358400 bytes 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/HISTORY b/HISTORY index 9a5845d..647d484 100755 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,5 @@ Jan. 29 2016 -Fixed lookup bugs with sub routine +Fixed lookup bugs with member sub routine of a class instance Fixed a member accessing bug with class instance Jan. 28 2016 diff --git a/core/my_basic.c b/core/my_basic.c index 2580481..9d29073 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -425,6 +425,7 @@ typedef struct _label_t { typedef struct _class_t { _ref_t ref; char* name; + struct _class_t* created_from; _ls_node_t* meta_list; struct _running_context_t* scope; struct _routine_t* hash; @@ -6454,6 +6455,7 @@ void _init_class(mb_interpreter_t* s, _class_t* instance, char* n) { instance->name = n; instance->meta_list = _ls_create(); instance->scope = _create_running_context(true); + instance->created_from = instance; } void _begin_class(mb_interpreter_t* s) { @@ -6621,7 +6623,7 @@ int _clone_clsss_field(void* data, void* extra, void* n) { break; case _DT_ROUTINE: sub = (_routine_t*)obj->data.routine; - if(!_search_identifier_in_scope_chain(instance->ref.s, instance->scope, sub->name, 0, 0, 0)) { + if(!_ht_find(instance->scope->var_dict, sub->name)) { _routine_t* routine = _clone_routine(sub, instance); ret = _create_object(); ret->type = _DT_ROUTINE; @@ -7726,6 +7728,7 @@ int _clone_object(mb_interpreter_t* s, _object_t* obj, _object_t* tgt) { case _DT_CLASS: tgt->data.instance = (_class_t*)mb_malloc(sizeof(_class_t)); _init_class(s, tgt->data.instance, mb_strdup(obj->data.instance->name, 0)); + tgt->data.instance->created_from = obj->data.instance->created_from; _push_scope_by_class(s, tgt->data.instance->scope); _traverse_class(obj->data.instance, _clone_clsss_field, _clone_class_meta_link, _META_LIST_MAX_DEPTH, false, tgt->data.instance, 0); _pop_scope(s, false); @@ -8666,7 +8669,7 @@ _retry: result = _core_let(s, (void**)&ast); } } else { - mb_assert(0 && "Impossible."); + result = _core_let(s, (void**)&ast); } } else { /* Do not need to path */ @@ -12785,10 +12788,25 @@ _retry: #else /* MB_ENABLE_LAMBDA */ { #endif /* MB_ENABLE_LAMBDA */ - if(routine->instance && (!s->last_instance || (s->last_instance && routine->instance && strcmp(s->last_instance->name, routine->instance->name)))) + bool_t is_a0 = false; + bool_t is_a1 = false; + if(s->last_instance && routine->instance) { + _traverse_class(s->last_instance->created_from, 0, _is_class, _META_LIST_MAX_DEPTH, true, routine->instance->created_from, &is_a0); + _traverse_class(routine->instance->created_from, 0, _is_class, _META_LIST_MAX_DEPTH, true, s->last_instance->created_from, &is_a1); + } + if(routine->instance && + (!s->last_instance || + (s->last_instance && + !is_a0 && !is_a1 && + s->last_instance->created_from != routine->instance && + routine->instance->created_from != s->last_instance + ) + ) + ) { pathed = _search_identifier_in_class(s, routine->instance, routine->name, 0, 0); - else + } else { pathed = _search_identifier_in_scope_chain(s, 0, routine->name, 0, 0, 0); + } if(pathed && pathed->data) { obj = (_object_t*)pathed->data; obj = _GET_ROUTINE(obj); diff --git a/output/my_basic.exe b/output/my_basic.exe index ce1b50e77423363504df096d204bdd5927bfd9e9..ba0d5c6761ca31fb4e3e8fd2d3f4596228492307 100755 GIT binary patch delta 17092 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