+added a _SIMPLE_ARG_ERROR macro. *fixed wrong usage of _MULTILINE_STATEMENT.

This commit is contained in:
Wang Renxin 2017-09-22 18:18:29 +08:00
parent 3cdb490ab1
commit c3438b2d57
2 changed files with 35 additions and 17 deletions

View File

@ -1,3 +1,6 @@
Sep. 22 2017
Added a _SIMPLE_ARG_ERROR macro
Sep. 13 2017
Fixed a referenced usertype cloning issue

View File

@ -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 */