From c3438b2d578e4ecb67913bf896eec11157f0f669 Mon Sep 17 00:00:00 2001 From: Wang Renxin Date: Fri, 22 Sep 2017 18:18:29 +0800 Subject: [PATCH] +added a _SIMPLE_ARG_ERROR macro. *fixed wrong usage of _MULTILINE_STATEMENT. --- HISTORY | 3 +++ core/my_basic.c | 49 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/HISTORY b/HISTORY index 5e97391..99981f9 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,6 @@ +Sep. 22 2017 +Added a _SIMPLE_ARG_ERROR macro + Sep. 13 2017 Fixed a referenced usertype cloning issue diff --git a/core/my_basic.c b/core/my_basic.c index 03235c0..8709c9b 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -117,6 +117,9 @@ extern "C" { /* Define as 1 to treat warning as error, 0 just leave it */ #define _WARNING_AS_ERROR 0 +/* Define as 1 to automatically raise error during popping argument, 0 just return an error result */ +#define _SIMPLE_ARG_ERROR 0 + /* Define as 1 to use a comma to PRINT a new line, 0 to use a semicolon */ #define _COMMA_AS_NEWLINE 0 @@ -869,7 +872,7 @@ typedef struct mb_interpreter_t { #ifdef MB_ENABLE_STACK_TRACE _ls_node_t* stack_frames; #endif /* MB_ENABLE_STACK_TRACE */ -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_node_t* multiline_enabled; #endif /* _MULTILINE_STATEMENT */ /** Error handling */ @@ -4104,7 +4107,7 @@ static int _pop_arg(mb_interpreter_t* s, _ls_node_t** l, mb_value_t* va, unsigne _ls_node_t* ast = *l; mb_make_nil(*arg); -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT if(_multiline_statement(s)) { _object_t* obj = 0; obj = (_object_t*)ast->data; @@ -10945,7 +10948,7 @@ _exit: /* Check whether multiline statement is allowed */ static bool_t _multiline_statement(mb_interpreter_t* s) { -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT if(_ls_empty(s->multiline_enabled)) return false; @@ -11451,7 +11454,7 @@ int mb_open(struct mb_interpreter_t** s) { #ifdef MB_ENABLE_STACK_TRACE (*s)->stack_frames = _ls_create(); #endif /* MB_ENABLE_STACK_TRACE */ -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT (*s)->multiline_enabled = _ls_create(); #endif /* _MULTILINE_STATEMENT */ @@ -11502,7 +11505,7 @@ int mb_close(struct mb_interpreter_t** s) { #ifdef MB_ENABLE_STACK_TRACE _ls_destroy((*s)->stack_frames); #endif /* MB_ENABLE_STACK_TRACE */ -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_destroy((*s)->multiline_enabled); #endif /* _MULTILINE_STATEMENT */ @@ -11582,7 +11585,7 @@ int mb_reset(struct mb_interpreter_t** s, bool_t clrf) { #ifdef MB_ENABLE_STACK_TRACE _ls_clear((*s)->stack_frames); #endif /* MB_ENABLE_STACK_TRACE */ -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_clear((*s)->multiline_enabled); #endif /* _MULTILINE_STATEMENT */ @@ -11637,7 +11640,7 @@ int mb_fork(struct mb_interpreter_t** s, struct mb_interpreter_t* r) { #ifdef MB_ENABLE_STACK_TRACE (*s)->stack_frames = _ls_create(); #endif /* MB_ENABLE_STACK_TRACE */ -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT (*s)->multiline_enabled = _ls_create(); #endif /* _MULTILINE_STATEMENT */ @@ -11671,7 +11674,7 @@ int mb_join(struct mb_interpreter_t** s) { #ifdef MB_ENABLE_STACK_TRACE _ls_destroy((*s)->stack_frames); #endif /* MB_ENABLE_STACK_TRACE */ -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_destroy((*s)->multiline_enabled); #endif /* _MULTILINE_STATEMENT */ @@ -11797,13 +11800,13 @@ int mb_attempt_func_begin(struct mb_interpreter_t* s, void** l) { goto _exit; } -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_pushback(s->multiline_enabled, (void*)(intptr_t)false); #endif /* _MULTILINE_STATEMENT */ ast = (_ls_node_t*)*l; obj = (_object_t*)ast->data; if(!(obj->type == _DT_FUNC)) { -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_popback(s->multiline_enabled); #endif /* _MULTILINE_STATEMENT */ _handle_error_on_obj(s, SE_RN_INCOMPLETE_STRUCTURE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); @@ -11825,7 +11828,7 @@ int mb_attempt_func_end(struct mb_interpreter_t* s, void** l) { if(!s || !l) { result = MB_FUNC_ERR; } else { -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_popback(s->multiline_enabled); #endif /* _MULTILINE_STATEMENT */ --s->no_eat_comma_mark; @@ -11847,7 +11850,7 @@ int mb_attempt_open_bracket(struct mb_interpreter_t* s, void** l) { } ast = (_ls_node_t*)*l; -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_pushback(s->multiline_enabled, (void*)(intptr_t)true); do { ast = ast->next; @@ -11858,7 +11861,7 @@ int mb_attempt_open_bracket(struct mb_interpreter_t* s, void** l) { obj = (_object_t*)ast->data; #endif /* _MULTILINE_STATEMENT */ if(!_IS_FUNC(obj, _core_open_bracket)) { -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_popback(s->multiline_enabled); #endif /* _MULTILINE_STATEMENT */ _handle_error_on_obj(s, SE_RN_OPEN_BRACKET_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); @@ -11887,7 +11890,7 @@ int mb_attempt_close_bracket(struct mb_interpreter_t* s, void** l) { if(!ast) { _handle_error_on_obj(s, SE_RN_CLOSE_BRACKET_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); } -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_popback(s->multiline_enabled); obj = (_object_t*)ast->data; while(obj && obj->type == _DT_EOS) { @@ -11919,7 +11922,7 @@ int mb_has_arg(struct mb_interpreter_t* s, void** l) { ast = (_ls_node_t*)*l; if(ast) { -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT if(_multiline_statement(s)) { obj = (_object_t*)ast->data; while(obj && obj->type == _DT_EOS) { @@ -11968,7 +11971,11 @@ int mb_pop_int(struct mb_interpreter_t* s, void** l, int_t* val) { break; default: _assign_public_value(&arg, 0); +#if _SIMPLE_ARG_ERROR + _handle_error_on_obj(s, SE_RN_NUMBER_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); +#else /* _SIMPLE_ARG_ERROR */ result = MB_FUNC_ERR; +#endif /* _SIMPLE_ARG_ERROR */ goto _exit; } @@ -12005,7 +12012,11 @@ int mb_pop_real(struct mb_interpreter_t* s, void** l, real_t* val) { break; default: _assign_public_value(&arg, 0); +#if _SIMPLE_ARG_ERROR + _handle_error_on_obj(s, SE_RN_NUMBER_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); +#else /* _SIMPLE_ARG_ERROR */ result = MB_FUNC_ERR; +#endif /* _SIMPLE_ARG_ERROR */ goto _exit; } @@ -12038,7 +12049,11 @@ int mb_pop_string(struct mb_interpreter_t* s, void** l, char** val) { break; default: _assign_public_value(&arg, 0); +#if _SIMPLE_ARG_ERROR + _handle_error_on_obj(s, SE_RN_STRING_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); +#else /* _SIMPLE_ARG_ERROR */ result = MB_FUNC_ERR; +#endif /* _SIMPLE_ARG_ERROR */ goto _exit; } @@ -12115,7 +12130,7 @@ int mb_pop_value(struct mb_interpreter_t* s, void** l, mb_value_t* val) { ast = (_ls_node_t*)*l; if(!ast) goto _exit; -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT if(_multiline_statement(s)) { _object_t* obj = 0; obj = (_object_t*)ast->data; @@ -13592,7 +13607,7 @@ int mb_run(struct mb_interpreter_t* s, bool_t clear_parser) { #endif /* MB_ENABLE_CLASS */ s->last_routine = 0; -#ifdef _MULTILINE_STATEMENT +#if _MULTILINE_STATEMENT _ls_clear(s->multiline_enabled); #endif /* _MULTILINE_STATEMENT */