From da3ad153b1404a5bc4d9fda389add8309609e2e4 Mon Sep 17 00:00:00 2001 From: Wang Renxin Date: Tue, 8 Sep 2015 13:26:54 +0800 Subject: [PATCH] *fixed a type parsing of sub routine bug; *fixed a scope processing bug. --- core/my_basic.c | 73 ++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 40 deletions(-) diff --git a/core/my_basic.c b/core/my_basic.c index c8953d5..fc04c0d 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -78,7 +78,7 @@ extern "C" { /** Macros */ #define _VER_MAJOR 1 #define _VER_MINOR 1 -#define _VER_REVISION 67 +#define _VER_REVISION 68 #define _MB_VERSION ((_VER_MAJOR * 0x01000000) + (_VER_MINOR * 0x00010000) + (_VER_REVISION)) /* Uncomment the line below to treat warning as error */ @@ -2479,53 +2479,49 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { goto _exit; } - if(context->last_symbol && context->last_symbol->type == _DT_FUNC) { - if(context->last_symbol->data.func->pointer == _core_dim) { + if(context->last_symbol && _IS_FUNC(context->last_symbol, _core_dim)) { #ifdef MB_SIMPLE_ARRAY - en = (sym[_sl - 1] == '$' ? _DT_STRING : _DT_REAL); + en = (sym[_sl - 1] == '$' ? _DT_STRING : _DT_REAL); #else /* MB_SIMPLE_ARRAY */ - en = _DT_REAL; + en = _DT_REAL; #endif /* MB_SIMPLE_ARRAY */ - memcpy(*value, &en, sizeof(en)); + memcpy(*value, &en, sizeof(en)); - result = _DT_ARRAY; + result = _DT_ARRAY; - goto _exit; - } + goto _exit; } /* _class_t */ - if(context->last_symbol && context->last_symbol->type == _DT_FUNC) { - if(context->last_symbol->data.func->pointer == _core_class) { - glbsyminscope = _search_var_in_scope_chain(s, 0, sym); - if(glbsyminscope && ((_object_t*)(glbsyminscope->data))->type == _DT_VAR) { - tmp.obj = (_object_t*)(glbsyminscope->data); - if(!tmp.obj->ref) { - _ht_remove(running->var_dict, sym, _ls_cmp_extra_string); - _dispose_object(tmp.obj); - } - tmp.obj->type = _DT_CLASS; - tmp.obj->data.instance = (_class_t*)mb_malloc(sizeof(_class_t)); - _init_instance(s, tmp.obj->data.instance, sym); - _ht_set_or_insert(running->var_dict, sym, tmp.obj); + if(context->last_symbol && _IS_FUNC(context->last_symbol, _core_class)) { + glbsyminscope = _search_var_in_scope_chain(s, 0, sym); + if(glbsyminscope && ((_object_t*)(glbsyminscope->data))->type == _DT_VAR) { + tmp.obj = (_object_t*)(glbsyminscope->data); + if(!tmp.obj->ref) { + _ht_remove(running->var_dict, sym, _ls_cmp_extra_string); + _dispose_object(tmp.obj); } - - result = _DT_CLASS; - - goto _exit; + tmp.obj->type = _DT_CLASS; + tmp.obj->data.instance = (_class_t*)mb_malloc(sizeof(_class_t)); + _init_instance(s, tmp.obj->data.instance, sym); + _ht_set_or_insert(running->var_dict, sym, tmp.obj); } + + result = _DT_CLASS; + + goto _exit; } /* _routine_t */ - if(context->last_symbol && context->last_symbol->type == _DT_FUNC) { + if(context->last_symbol) { glbsyminscope = _search_var_in_scope_chain(s, 0, sym); if(glbsyminscope && ((_object_t*)glbsyminscope->data)->type == _DT_ROUTINE) { - if(context->last_symbol->data.func->pointer == _core_def) + if(_IS_FUNC(context->last_symbol, _core_def)) _begin_routine(s); result = _DT_ROUTINE; goto _exit; } - if(context->last_symbol->data.func->pointer == _core_def || context->last_symbol->data.func->pointer == _core_call) { - if(context->last_symbol->data.func->pointer == _core_def) + if(_IS_FUNC(context->last_symbol, _core_def) || _IS_FUNC(context->last_symbol, _core_call)) { + if(_IS_FUNC(context->last_symbol, _core_def)) _begin_routine(s); if(!_is_identifier_char(sym[0])) { result = _DT_NIL; @@ -2548,7 +2544,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { result = _DT_ROUTINE; goto _exit; - } else if(context->last_symbol->data.func->pointer == _core_enddef) { + } else if(_IS_FUNC(context->last_symbol, _core_enddef)) { _end_routine(s); _pop_scope(s); } @@ -2624,12 +2620,10 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { goto _exit; } } - if(context->last_symbol && context->last_symbol->type == _DT_FUNC) { - if(context->last_symbol->data.func->pointer == _core_goto || context->last_symbol->data.func->pointer == _core_gosub) { - result = _DT_LABEL; + if(context->last_symbol && (_IS_FUNC(context->last_symbol, _core_goto) || _IS_FUNC(context->last_symbol, _core_gosub))) { + result = _DT_LABEL; - goto _exit; - } + goto _exit; } /* Otherwise */ result = _DT_VAR; @@ -3673,7 +3667,7 @@ int _skip_to(mb_interpreter_t* s, _ls_node_t** l, mb_func_t f, _data_e t) { obj = (_object_t*)(ast->data); *l = ast; ast = ast->next; - } while(!(obj->type == _DT_FUNC && obj->data.func->pointer == f) && obj->type != t); + } while(!(_IS_FUNC(obj, f)) && obj->type != t); _exit: return result; @@ -4759,9 +4753,6 @@ int mb_run(struct mb_interpreter_t* s) { running = s->running_context; - while(s->running_context->prev) - s->running_context = s->running_context->prev; - if(s->parsing_context) safe_free(s->parsing_context); @@ -4771,6 +4762,8 @@ int mb_run(struct mb_interpreter_t* s) { s->suspent_point = 0; } else { mb_assert(!s->no_eat_comma_mark); + while(s->running_context->prev) + s->running_context = s->running_context->prev; ast = s->ast; ast = ast->next; if(!ast) {