*fixed lookup bugs with member sub routine of a class instance.
This commit is contained in:
parent
0b3c2af998
commit
c5edb2b1f2
2
HISTORY
2
HISTORY
@ -1,5 +1,5 @@
|
|||||||
Jan. 29 2016
|
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
|
Fixed a member accessing bug with class instance
|
||||||
|
|
||||||
Jan. 28 2016
|
Jan. 28 2016
|
||||||
|
@ -425,6 +425,7 @@ typedef struct _label_t {
|
|||||||
typedef struct _class_t {
|
typedef struct _class_t {
|
||||||
_ref_t ref;
|
_ref_t ref;
|
||||||
char* name;
|
char* name;
|
||||||
|
struct _class_t* created_from;
|
||||||
_ls_node_t* meta_list;
|
_ls_node_t* meta_list;
|
||||||
struct _running_context_t* scope;
|
struct _running_context_t* scope;
|
||||||
struct _routine_t* hash;
|
struct _routine_t* hash;
|
||||||
@ -6454,6 +6455,7 @@ void _init_class(mb_interpreter_t* s, _class_t* instance, char* n) {
|
|||||||
instance->name = n;
|
instance->name = n;
|
||||||
instance->meta_list = _ls_create();
|
instance->meta_list = _ls_create();
|
||||||
instance->scope = _create_running_context(true);
|
instance->scope = _create_running_context(true);
|
||||||
|
instance->created_from = instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _begin_class(mb_interpreter_t* s) {
|
void _begin_class(mb_interpreter_t* s) {
|
||||||
@ -6621,7 +6623,7 @@ int _clone_clsss_field(void* data, void* extra, void* n) {
|
|||||||
break;
|
break;
|
||||||
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, 0)) {
|
if(!_ht_find(instance->scope->var_dict, sub->name)) {
|
||||||
_routine_t* routine = _clone_routine(sub, instance);
|
_routine_t* routine = _clone_routine(sub, instance);
|
||||||
ret = _create_object();
|
ret = _create_object();
|
||||||
ret->type = _DT_ROUTINE;
|
ret->type = _DT_ROUTINE;
|
||||||
@ -7726,6 +7728,7 @@ int _clone_object(mb_interpreter_t* s, _object_t* obj, _object_t* tgt) {
|
|||||||
case _DT_CLASS:
|
case _DT_CLASS:
|
||||||
tgt->data.instance = (_class_t*)mb_malloc(sizeof(_class_t));
|
tgt->data.instance = (_class_t*)mb_malloc(sizeof(_class_t));
|
||||||
_init_class(s, tgt->data.instance, mb_strdup(obj->data.instance->name, 0));
|
_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);
|
_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);
|
_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);
|
_pop_scope(s, false);
|
||||||
@ -8666,7 +8669,7 @@ _retry:
|
|||||||
result = _core_let(s, (void**)&ast);
|
result = _core_let(s, (void**)&ast);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mb_assert(0 && "Impossible.");
|
result = _core_let(s, (void**)&ast);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Do not need to path */
|
/* Do not need to path */
|
||||||
@ -12785,10 +12788,25 @@ _retry:
|
|||||||
#else /* MB_ENABLE_LAMBDA */
|
#else /* MB_ENABLE_LAMBDA */
|
||||||
{
|
{
|
||||||
#endif /* 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);
|
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);
|
pathed = _search_identifier_in_scope_chain(s, 0, routine->name, 0, 0, 0);
|
||||||
|
}
|
||||||
if(pathed && pathed->data) {
|
if(pathed && pathed->data) {
|
||||||
obj = (_object_t*)pathed->data;
|
obj = (_object_t*)pathed->data;
|
||||||
obj = _GET_ROUTINE(obj);
|
obj = _GET_ROUTINE(obj);
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user