*fixed a lookup issue with the mb_get_var function.

This commit is contained in:
Wang Renxin 2017-11-25 14:47:05 +08:00
parent 7ee57db895
commit 6ff2f37a6d
2 changed files with 15 additions and 5 deletions

View File

@ -1,3 +1,6 @@
Nov. 25 2017
Fixed a lookup issue with the mb_get_var function
Nov. 17 2017 Nov. 17 2017
Fixed an assignment issue with upvalues Fixed an assignment issue with upvalues
Fixed a variable lookup issue with a ranged FOR loop Fixed a variable lookup issue with a ranged FOR loop

View File

@ -1884,7 +1884,7 @@ static _running_context_ref_t* _get_root_ref_scope(_running_context_ref_t* scope
static _running_context_t* _get_scope_to_add_routine(mb_interpreter_t* s); static _running_context_t* _get_scope_to_add_routine(mb_interpreter_t* s);
static _ls_node_t* _search_identifier_in_scope_chain(mb_interpreter_t* s, _running_context_t* scope, const char* n, int fp, _ht_node_t** ht, _running_context_t** sp); static _ls_node_t* _search_identifier_in_scope_chain(mb_interpreter_t* s, _running_context_t* scope, const char* n, int fp, _ht_node_t** ht, _running_context_t** sp);
static _array_t* _search_array_in_scope_chain(mb_interpreter_t* s, _array_t* i, _object_t** o); static _array_t* _search_array_in_scope_chain(mb_interpreter_t* s, _array_t* i, _object_t** o);
static _var_t* _search_var_in_scope_chain(mb_interpreter_t* s, _var_t* i); static _var_t* _search_var_in_scope_chain(mb_interpreter_t* s, _var_t* i, _object_t** o);
static _ls_node_t* _search_identifier_accessor(mb_interpreter_t* s, _running_context_t* scope, const char* n, _ht_node_t** ht, _running_context_t** sp, bool_t unknown_for_not_found); static _ls_node_t* _search_identifier_accessor(mb_interpreter_t* s, _running_context_t* scope, const char* n, _ht_node_t** ht, _running_context_t** sp, bool_t unknown_for_not_found);
static _var_t* _create_var(_object_t** oobj, const char* n, size_t ns, bool_t dup_name); static _var_t* _create_var(_object_t** oobj, const char* n, size_t ns, bool_t dup_name);
@ -9444,19 +9444,22 @@ static _array_t* _search_array_in_scope_chain(mb_interpreter_t* s, _array_t* i,
} }
/* Try to search a variable in a scope chain */ /* Try to search a variable in a scope chain */
static _var_t* _search_var_in_scope_chain(mb_interpreter_t* s, _var_t* i) { static _var_t* _search_var_in_scope_chain(mb_interpreter_t* s, _var_t* i, _object_t** o) {
_object_t* obj = 0; _object_t* obj = 0;
_ls_node_t* scp = 0; _ls_node_t* scp = 0;
_var_t* result = 0; _var_t* result = 0;
mb_assert(s && i); mb_assert(s && i);
if(o) *o = 0;
result = i; result = i;
scp = _search_identifier_in_scope_chain(s, 0, result->name, _PATHING_NORMAL, 0, 0); scp = _search_identifier_in_scope_chain(s, 0, result->name, _PATHING_NORMAL, 0, 0);
if(scp) { if(scp) {
obj = (_object_t*)scp->data; obj = (_object_t*)scp->data;
if(obj && obj->type == _DT_VAR) if(obj && obj->type == _DT_VAR) {
if(o) *o = obj;
result = obj->data.variable; result = obj->data.variable;
}
} }
return result; return result;
@ -11166,7 +11169,7 @@ static int _execute_ranged_for_loop(mb_interpreter_t* s, _ls_node_t** l, _var_t*
running = s->running_context; running = s->running_context;
#ifdef MB_ENABLE_CLASS #ifdef MB_ENABLE_CLASS
if(var_loop->pathing) if(var_loop->pathing)
pathed_var = _search_var_in_scope_chain(s, var_loop); pathed_var = _search_var_in_scope_chain(s, var_loop, 0);
if(pathed_var) { if(pathed_var) {
_UNREF(pathed_var->data) _UNREF(pathed_var->data)
_MAKE_NIL(pathed_var->data); _MAKE_NIL(pathed_var->data);
@ -13070,6 +13073,10 @@ int mb_get_var(struct mb_interpreter_t* s, void** l, void** v) {
} }
if(obj && obj->type == _DT_VAR) { if(obj && obj->type == _DT_VAR) {
#ifdef MB_ENABLE_CLASS
if(obj->data.variable->pathing)
_search_var_in_scope_chain(s, obj->data.variable, &obj);
#endif /* MB_ENABLE_CLASS */
if(v) if(v)
*v = obj; *v = obj;
} }
@ -15244,7 +15251,7 @@ static int _core_let(mb_interpreter_t* s, void** l) {
_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, _exit, result);
} else { } else {
evar = obj->data.variable; evar = obj->data.variable;
var = _search_var_in_scope_chain(s, obj->data.variable); var = _search_var_in_scope_chain(s, obj->data.variable, 0);
if(var == evar) evar = 0; if(var == evar) evar = 0;
#ifdef MB_ENABLE_CLASS #ifdef MB_ENABLE_CLASS
if(evar && evar->pathing == _PATHING_UPVALUE) evar = 0; if(evar && evar->pathing == _PATHING_UPVALUE) evar = 0;