diff --git a/HISTORY b/HISTORY index 93ac2ad..4041269 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,6 @@ +Jan. 19 2017 +Fixed a crash bug with unmatched ENDIF statement, thanks to yukini3 for pointing it out + Jan. 17 2017 Improved the stepped handler diff --git a/core/my_basic.c b/core/my_basic.c index 2d26655..45aa9c4 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -257,6 +257,7 @@ static const char* _ERR_DESC[] = { "Number expected", "Integer expected", "ELSE statement expected", + "ENDIF statement expected", "TO statement expected", "NEXT statement expected", "UNTIL statement expected", @@ -1336,16 +1337,18 @@ static mb_meta_status_u _try_overridden(mb_interpreter_t* s, void** l, mb_value_ #if _WARNING_AS_ERROR # define _handle_error_at_pos(__s, __err, __f, __pos, __row, __col, __ret, __exit, __result) \ do { \ - _set_current_error((__s), (__err), (__f)); \ - _set_error_pos((__s), (__pos), (__row), (__col)); \ + if(_set_current_error((__s), (__err), (__f))) { \ + _set_error_pos((__s), (__pos), (__row), (__col)); \ + } \ __result = (__ret); \ goto __exit; \ } while(0) #else /* _WARNING_AS_ERROR */ # define _handle_error_at_pos(__s, __err, __f, __pos, __row, __col, __ret, __exit, __result) \ do { \ - _set_current_error((__s), (__err), (__f)); \ - _set_error_pos((__s), (__pos), (__row), (__col)); \ + if(_set_current_error((__s), (__err), (__f))) { \ + _set_error_pos((__s), (__pos), (__row), (__col)); \ + } \ if((__ret) != MB_FUNC_WARNING) { \ __result = (__ret); \ } \ @@ -1368,7 +1371,7 @@ static mb_meta_status_u _try_overridden(mb_interpreter_t* s, void** l, mb_value_ #define _OUTTER_SCOPE(__s) ((__s)->prev ? (__s)->prev : (__s)) -static void _set_current_error(mb_interpreter_t* s, mb_error_e err, char* f); +static bool_t _set_current_error(mb_interpreter_t* s, mb_error_e err, char* f); static mb_print_func_t _get_printer(mb_interpreter_t* s); static mb_input_func_t _get_inputer(mb_interpreter_t* s); @@ -3487,12 +3490,13 @@ static _object_t* _operate_operand(mb_interpreter_t* s, _object_t* optr, _object if(_status != MB_FUNC_WARNING) { safe_free(result); } - _set_current_error(s, SE_RN_OPERATION_FAILED, 0); + if(_set_current_error(s, SE_RN_OPERATION_FAILED, 0)) { #ifdef MB_ENABLE_SOURCE_TRACE - _set_error_pos(s, optr->source_pos, optr->source_row, optr->source_col); + _set_error_pos(s, optr->source_pos, optr->source_row, optr->source_col); #else /* MB_ENABLE_SOURCE_TRACE */ - _set_error_pos(s, 0, 0, 0); + _set_error_pos(s, 0, 0, 0); #endif /* MB_ENABLE_SOURCE_TRACE */ + } } return result; @@ -4558,13 +4562,17 @@ static mb_meta_status_u _try_overridden(mb_interpreter_t* s, void** l, mb_value_ /** Handlers */ /* Set current error information */ -static void _set_current_error(mb_interpreter_t* s, mb_error_e err, char* f) { +static bool_t _set_current_error(mb_interpreter_t* s, mb_error_e err, char* f) { mb_assert(s && err >= 0); if(s->last_error == SE_NO_ERR) { s->last_error = err; s->last_error_file = f; + + return true; } + + return false; } /* Get a print functor of an interpreter */ @@ -12834,7 +12842,7 @@ mb_error_e mb_get_last_error(struct mb_interpreter_t* s) { mb_assert(s); result = s->last_error; - s->last_error = SE_NO_ERR; + s->last_error = SE_NO_ERR; /* Clear error state */ return result; } @@ -13890,9 +13898,16 @@ _elseif: } do { - ast = ast->next; - while(_IS_EOS(ast->data)) + _ls_node_t* la = 0; + la = ast = ast->next; + while(ast && _IS_EOS(ast->data)) { ast = ast->next; + if(ast) la = ast; + } + if(!ast) { + mb_get_last_error(s); + _handle_error_on_obj(s, SE_RN_ENDIF_EXPECTED, s->source_file, DON(la), MB_FUNC_ERR, _exit, result); + } if(ast && _IS_FUNC(ast->data, _core_endif)) { ast = ast->prev; diff --git a/core/my_basic.h b/core/my_basic.h index a38350f..028d25a 100755 --- a/core/my_basic.h +++ b/core/my_basic.h @@ -404,6 +404,7 @@ typedef enum mb_error_e { SE_RN_NUMBER_EXPECTED, SE_RN_INTEGER_EXPECTED, SE_RN_ELSE_EXPECTED, + SE_RN_ENDIF_EXPECTED, SE_RN_TO_EXPECTED, SE_RN_NEXT_EXPECTED, SE_RN_UNTIL_EXPECTED, diff --git a/output/my_basic.exe b/output/my_basic.exe index d6cb586..f10dea5 100755 Binary files a/output/my_basic.exe and b/output/my_basic.exe differ diff --git a/output/my_basic_mac b/output/my_basic_mac index 388731f..a040e2d 100755 Binary files a/output/my_basic_mac and b/output/my_basic_mac differ