From 2c722f5b073b1f744b0a0ef0f3e671d3e63c270b Mon Sep 17 00:00:00 2001 From: tony Date: Sat, 11 Apr 2015 15:06:27 +0800 Subject: [PATCH] +mb_has_argument; *memory occupation optimize --- HISTORY | 50 +++++---- core/my_basic.c | 236 ++++++++++++++++++++++++++++--------------- core/my_basic.h | 74 ++++++-------- output/my_basic_mac | Bin 81728 -> 81832 bytes resource/my_basic.rc | 4 +- shell/main.c | 6 +- 6 files changed, 219 insertions(+), 151 deletions(-) diff --git a/HISTORY b/HISTORY index 10052bd..d2e8234 100755 --- a/HISTORY +++ b/HISTORY @@ -1,24 +1,30 @@ -Apr. 10 2015 -Improved compatibility with PellesC -Fixed a double precision float parsing bug on all 32bit systems, thanks to Pito for pointing it out -Fixed a exponential number parsing bug, thanks to Pito for pointing it out -Fixed a crash bug when a script begins with a meaningless negtive number - -Mar. 25 2015 -Changed _strupr macro to mb_strupr function -Added an mb_strdup function -Fixed an intermediate value disposing more than once bug - -Dec. 17 2014 -Fixed a calculation crash bug -Fixed a memory leak with intermediate value - -Dec. 16 2014 -Fixed a negative calculation bug in a function argument - -Dec. 9 2014 -Improved compatibility with BCB - +Apr. 11 2015 +Moved struct mb_interpreter_t from my_basic.h to my_basic.c +Added an mb_has_argument interface to tell whether there is any more argument +Added an MB_ENABLE_SOURCE_TRACE macro to enable or disable source tracing +Disposed parsing context at runtime to reduce memory occupation + +Apr. 10 2015 +Improved compatibility with PellesC +Fixed a double precision float parsing bug on all 32bit systems, thanks to Pito for pointing it out +Fixed an exponential number parsing bug, thanks to Pito for pointing it out +Fixed a crash bug when a script begins with a meaningless negtive number + +Mar. 25 2015 +Changed _strupr macro to mb_strupr function +Added an mb_strdup function +Fixed an intermediate value disposing more than once bug + +Dec. 17 2014 +Fixed a calculation crash bug +Fixed a memory leak with intermediate value + +Dec. 16 2014 +Fixed a negative calculation bug in a function argument + +Dec. 9 2014 +Improved compatibility with BCB + May. 25 2014 Added an mb_set_inputer function which allows the user to specify an INPUT reader, thanks to Michael P. Welch for suggestion Added an mb_remove_reserved_func function which allows the user to disable/remove a reserved statement @@ -139,7 +145,7 @@ Fixed some mistakes Allowed underline character appear in an identifier Apr. 15 2011 -Fixed garbage collection and _label_t release bugs +Fixed garbage collection and _label_t disposing bugs Apr. 14 2011 Fixed some list / comparison operator bugs diff --git a/core/my_basic.c b/core/my_basic.c index c71d025..130faa9 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 0 -#define _VER_REVISION 47 +#define _VER_REVISION 48 #define _MB_VERSION ((_VER_MAJOR * 0x01000000) + (_VER_MINOR * 0x00010000) + (_VER_REVISION)) /* Uncomment this line to treat warnings as error */ @@ -275,9 +275,13 @@ typedef struct _object_t { _raw_t raw; } data; bool_t ref; +#ifdef MB_ENABLE_SOURCE_TRACE int source_pos; unsigned short source_row; unsigned short source_col; +#else /* MB_ENABLE_SOURCE_TRACE */ + char source_pos; +#endif /* MB_ENABLE_SOURCE_TRACE */ } _object_t; static const _object_t _OBJ_INT_UNIT = { _DT_INT, 1, false, 0 }; @@ -326,6 +330,24 @@ typedef struct _tuple3_t { void* e3; } _tuple3_t; +/* Interpreter tag */ +typedef struct mb_interpreter_t { + _ht_node_t* local_func_dict; + _ht_node_t* global_func_dict; + _ht_node_t* global_var_dict; + _ls_node_t* ast; + _parsing_context_t* parsing_context; + _running_context_t* running_context; + mb_error_e last_error; + int last_error_pos; + unsigned short last_error_row; + unsigned short last_error_col; + mb_error_handler_t error_handler; + mb_print_func_t printer; + mb_input_func_t inputer; + void* userdata; +} mb_interpreter_t; + static const char _PRECEDE_TABLE[19][19] = { /* + - * / MOD ^ ( ) = > < >= <= == <> AND OR NOT NEG */ { '>', '>', '<', '<', '<', '<', '<', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>' }, /* + */ @@ -633,10 +655,15 @@ static bool_t _is_print_terminal(mb_interpreter_t* s, _object_t* obj); goto __exit; \ } while(0) #endif /* _WARING_AS_ERROR */ +#ifdef MB_ENABLE_SOURCE_TRACE +# define _HANDLE_ERROR(__s, __err, __obj, __ret, __exit, __result) _handle_error(__s, __err, (__obj)->source_pos, (__obj)->source_row, (__obj)->source_col, __ret, __exit, __result) +#else /* MB_ENABLE_SOURCE_TRACE */ +# define _HANDLE_ERROR(__s, __err, __obj, __ret, __exit, __result) _handle_error(__s, __err, 0, 0, 0, __ret, __exit, __result) +#endif /* MB_ENABLE_SOURCE_TRACE */ #define _handle_error_on_obj(__s, __err, __obj, __ret, __exit, __result) \ do { \ if(__obj) { \ - _handle_error(__s, __err, (__obj)->source_pos, (__obj)->source_row, (__obj)->source_col, __ret, __exit, __result); \ + _HANDLE_ERROR(__s, __err, __obj, __ret, __exit, __result); \ } else { \ _handle_error(__s, __err, 0, 0, 0, __ret, __exit, __result); \ } \ @@ -1725,7 +1752,11 @@ _object_t* _operate_operand(mb_interpreter_t* s, _object_t* optr, _object_t* opn result = 0; } _set_current_error(s, SE_RN_OPERATION_FAILED); +#ifdef MB_ENABLE_SOURCE_TRACE _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); +#endif /* MB_ENABLE_SOURCE_TRACE */ } return result; @@ -1779,7 +1810,7 @@ int _calc_expression(mb_interpreter_t* s, _ls_node_t** l, _object_t** val) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ast = *l; garbage = _ls_create(); optr = _ls_create(); @@ -2107,7 +2138,7 @@ int _append_char_to_symbol(mb_interpreter_t* s, char c) { mb_assert(s); - context = (_parsing_context_t*)(s->parsing_context); + context = s->parsing_context; if(context->current_symbol_nonius + 1 >= _SINGLE_SYMBOL_MAX_LENGTH) { _set_current_error(s, SE_PS_SYMBOL_TOO_LONG); @@ -2131,7 +2162,7 @@ int _cut_symbol(mb_interpreter_t* s, int pos, unsigned short row, unsigned short mb_assert(s); - context = (_parsing_context_t*)(s->parsing_context); + context = s->parsing_context; if(context->current_symbol_nonius && context->current_symbol[0] != '\0') { sym = (char*)mb_malloc(context->current_symbol_nonius + 1); memcpy(sym, context->current_symbol, context->current_symbol_nonius + 1); @@ -2159,19 +2190,23 @@ int _append_symbol(mb_interpreter_t* s, char* sym, bool_t* delsym, int pos, unsi mb_assert(s && sym); - ast = (_ls_node_t*)(s->ast); + ast = s->ast; result = _create_symbol(s, ast, sym, &obj, &assign, delsym); if(obj) { +#ifdef MB_ENABLE_SOURCE_TRACE obj->source_pos = pos; obj->source_row = row; obj->source_col = col; +#else /* MB_ENABLE_SOURCE_TRACE */ + obj->source_pos = (char)pos; +#endif /* MB_ENABLE_SOURCE_TRACE */ node = _ls_pushback(ast, obj); if(assign) { *assign = node; } - context = (_parsing_context_t*)s->parsing_context; + context = s->parsing_context; context->last_symbol = obj; } @@ -2193,12 +2228,16 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob memset(value, 0, sizeof(_raw_t)); - context = (_parsing_context_t*)s->parsing_context; + context = s->parsing_context; *obj = (_object_t*)mb_malloc(sizeof(_object_t)); memset(*obj, 0, sizeof(_object_t)); +#ifdef MB_ENABLE_SOURCE_TRACE (*obj)->source_pos = -1; (*obj)->source_row = (*obj)->source_col = 0xffff; +#else /* MB_ENABLE_SOURCE_TRACE */ + (*obj)->source_pos = -1; +#endif /* MB_ENABLE_SOURCE_TRACE */ type = _get_symbol_type(s, sym, &value); (*obj)->type = type; @@ -2233,7 +2272,7 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob break; case _DT_ARRAY: - glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); + glbsyminscope = _ht_find(s->global_var_dict, sym); if(glbsyminscope && ((_object_t*)(glbsyminscope->data))->type == _DT_ARRAY) { (*obj)->data.array = ((_object_t*)(glbsyminscope->data))->data.array; (*obj)->ref = true; @@ -2245,7 +2284,7 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob memcpy(&tmp.array->type, value, sizeof(tmp.array->type)); (*obj)->data.array = tmp.array; - ul = _ht_set_or_insert((_ht_node_t*)s->global_var_dict, sym, *obj); + ul = _ht_set_or_insert(s->global_var_dict, sym, *obj); mb_assert(ul); *obj = (_object_t*)mb_malloc(sizeof(_object_t)); @@ -2257,7 +2296,7 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob break; case _DT_VAR: - glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); + glbsyminscope = _ht_find(s->global_var_dict, sym); if(glbsyminscope && ((_object_t*)(glbsyminscope->data))->type == _DT_VAR) { (*obj)->data.variable = ((_object_t*)(glbsyminscope->data))->data.variable; (*obj)->ref = true; @@ -2272,7 +2311,7 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob tmp.var->data->data.integer = 0; (*obj)->data.variable = tmp.var; - ul = _ht_set_or_insert((_ht_node_t*)s->global_var_dict, sym, *obj); + ul = _ht_set_or_insert(s->global_var_dict, sym, *obj); mb_assert(ul); *obj = (_object_t*)mb_malloc(sizeof(_object_t)); @@ -2296,7 +2335,7 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob *asgn = &(tmp.label->node); (*obj)->data.label = tmp.label; - ul = _ht_set_or_insert((_ht_node_t*)s->global_var_dict, sym, *obj); + ul = _ht_set_or_insert(s->global_var_dict, sym, *obj); mb_assert(ul); *obj = (_object_t*)mb_malloc(sizeof(_object_t)); @@ -2344,7 +2383,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { _sl = strlen(sym); mb_assert(_sl > 0); - context = (_parsing_context_t*)s->parsing_context; + context = s->parsing_context; /* int_t */ tmp.integer = (int_t)strtol(sym, &conv_suc, 0); @@ -2371,7 +2410,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { goto _exit; } /* _array_t */ - glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); + glbsyminscope = _ht_find(s->global_var_dict, sym); if(glbsyminscope && ((_object_t*)(glbsyminscope->data))->type == _DT_ARRAY) { tmp.obj = (_object_t*)(glbsyminscope->data); memcpy(*value, &(tmp.obj->data.array->type), sizeof(tmp.obj->data.array->type)); @@ -2403,8 +2442,8 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { goto _exit; } } - lclsyminscope = _ht_find((_ht_node_t*)s->local_func_dict, sym); - glbsyminscope = _ht_find((_ht_node_t*)s->global_func_dict, sym); + lclsyminscope = _ht_find(s->local_func_dict, sym); + glbsyminscope = _ht_find(s->global_func_dict, sym); if(lclsyminscope || glbsyminscope) { ptr = lclsyminscope ? (intptr_t)lclsyminscope->data : (intptr_t)glbsyminscope->data; memcpy(*value, &ptr, sizeof(intptr_t)); @@ -2426,7 +2465,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { goto _exit; } /* _var_t */ - glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); + glbsyminscope = _ht_find(s->global_var_dict, sym); if(glbsyminscope) { if(((_object_t*)glbsyminscope->data)->type != _DT_LABEL) { memcpy(*value, &glbsyminscope->data, sizeof(glbsyminscope->data)); @@ -2439,7 +2478,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { /* _label_t */ if(context->current_char == ':') { if(!context->last_symbol || context->last_symbol->type == _DT_EOS) { - glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); + glbsyminscope = _ht_find(s->global_var_dict, sym); if(glbsyminscope) { memcpy(*value, &glbsyminscope->data, sizeof(glbsyminscope->data)); } @@ -2471,7 +2510,7 @@ int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row, unsign mb_assert(s && s->parsing_context); - context = (_parsing_context_t*)(s->parsing_context); + context = s->parsing_context; last_char = context->current_char; context->current_char = c; @@ -2888,9 +2927,13 @@ int _dispose_object(_object_t* obj) { obj->ref = false; obj->type = _DT_NIL; memset(&obj->data, 0, sizeof(obj->data)); +#ifdef MB_ENABLE_SOURCE_TRACE obj->source_pos = 0; obj->source_row = 0; obj->source_col = 0; +#else /* MB_ENABLE_SOURCE_TRACE */ + obj->source_pos = 0; +#endif /* MB_ENABLE_SOURCE_TRACE */ ++result; _exit: @@ -3053,7 +3096,7 @@ void _try_clear_intermediate_value(void* data, void* extra, mb_interpreter_t* s) return; obj = (_object_t*)data; - running = (_running_context_t*)(s->running_context); + running = s->running_context; if(obj->type == _DT_STRING && running->intermediate_value.type == MB_DT_STRING && obj->data.string == running->intermediate_value.value.string) { running->intermediate_value.type = MB_DT_NIL; @@ -3070,7 +3113,7 @@ int _execute_statement(mb_interpreter_t* s, _ls_node_t** l) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ast = *l; @@ -3201,7 +3244,7 @@ int _register_func(mb_interpreter_t* s, const char* n, mb_func_t f, bool_t local return result; } - scope = (_ht_node_t*)(local ? s->local_func_dict : s->global_func_dict); + scope = local ? s->local_func_dict : s->global_func_dict; exists = _ht_find(scope, (void*)n); if(!exists) { size_t _sl = strlen(n); @@ -3229,7 +3272,7 @@ int _remove_func(mb_interpreter_t* s, const char* n, bool_t local) { return result; } - scope = (_ht_node_t*)(local ? s->local_func_dict : s->global_func_dict); + scope = local ? s->local_func_dict : s->global_func_dict; exists = _ht_find(scope, (void*)n); if(exists) { size_t _sl = strlen(n); @@ -3252,9 +3295,9 @@ int _open_constant(mb_interpreter_t* s) { mb_assert(s); - ul = _ht_set_or_insert((_ht_node_t*)(s->global_var_dict), "TRUE", (_OBJ_BOOL_TRUE)); + ul = _ht_set_or_insert(s->global_var_dict, "TRUE", _OBJ_BOOL_TRUE); mb_assert(ul); - ul = _ht_set_or_insert((_ht_node_t*)(s->global_var_dict), "FALSE", (_OBJ_BOOL_FALSE)); + ul = _ht_set_or_insert(s->global_var_dict, "FALSE", _OBJ_BOOL_FALSE); mb_assert(ul); return result; @@ -3447,7 +3490,7 @@ int mb_dispose(void) { return result; } -int mb_open(mb_interpreter_t** s) { +int mb_open(struct mb_interpreter_t** s) { /* Initialize a MY-BASIC environment */ int result = MB_FUNC_OK; _ht_node_t* local_scope = 0; @@ -3493,7 +3536,7 @@ int mb_open(mb_interpreter_t** s) { return result; } -int mb_close(mb_interpreter_t** s) { +int mb_close(struct mb_interpreter_t** s) { /* Close a MY-BASIC environment */ int result = MB_FUNC_OK; _ht_node_t* local_scope = 0; @@ -3507,7 +3550,7 @@ int mb_close(mb_interpreter_t** s) { _close_std_lib(*s); _close_core_lib(*s); - running = (_running_context_t*)((*s)->running_context); + running = (*s)->running_context; mb_dispose_value(*s, running->intermediate_value); _ls_foreach(running->temp_values, _destroy_object); @@ -3517,22 +3560,24 @@ int mb_close(mb_interpreter_t** s) { _ls_destroy(running->sub_stack); safe_free(running); - context = (_parsing_context_t*)((*s)->parsing_context); - safe_free(context); + context = (*s)->parsing_context; + if(context) { + safe_free(context); + } - ast = (_ls_node_t*)((*s)->ast); + ast = (*s)->ast; _ls_foreach(ast, _destroy_object); _ls_destroy(ast); - global_scope = (_ht_node_t*)((*s)->global_var_dict); + global_scope = (*s)->global_var_dict; _ht_foreach(global_scope, _destroy_object); _ht_destroy(global_scope); - global_scope = (_ht_node_t*)((*s)->global_func_dict); + global_scope = (*s)->global_func_dict; _ht_foreach(global_scope, _ls_free_extra); _ht_destroy(global_scope); - local_scope = (_ht_node_t*)((*s)->local_func_dict); + local_scope = (*s)->local_func_dict; _ht_foreach(local_scope, _ls_free_extra); _ht_destroy(local_scope); @@ -3544,7 +3589,7 @@ int mb_close(mb_interpreter_t** s) { return result; } -int mb_reset(mb_interpreter_t** s, bool_t clrf/* = false*/) { +int mb_reset(struct mb_interpreter_t** s, bool_t clrf/* = false*/) { /* Reset a MY-BASIC environment */ int result = MB_FUNC_OK; _ht_node_t* global_scope = 0; @@ -3556,26 +3601,31 @@ int mb_reset(mb_interpreter_t** s, bool_t clrf/* = false*/) { (*s)->last_error = SE_NO_ERR; - running = (_running_context_t*)((*s)->running_context); + running = (*s)->running_context; _ls_clear(running->sub_stack); running->suspent_point = 0; running->next_loop_var = 0; running->no_eat_comma_mark = 0; memset(&(running->intermediate_value), 0, sizeof(mb_value_t)); - context = (_parsing_context_t*)((*s)->parsing_context); + context = (*s)->parsing_context; + if(!context) { + context = (_parsing_context_t*)mb_malloc(sizeof(_parsing_context_t)); + memset(context, 0, sizeof(_parsing_context_t)); + (*s)->parsing_context = context; + } memset(context, 0, sizeof(_parsing_context_t)); - ast = (_ls_node_t*)((*s)->ast); + ast = (*s)->ast; _ls_foreach(ast, _destroy_object); _ls_clear(ast); - global_scope = (_ht_node_t*)((*s)->global_var_dict); + global_scope = (*s)->global_var_dict; _ht_foreach(global_scope, _destroy_object); _ht_clear(global_scope); if(clrf) { - global_scope = (_ht_node_t*)((*s)->global_func_dict); + global_scope = (*s)->global_func_dict; _ht_foreach(global_scope, _ls_free_extra); _ht_clear(global_scope); } @@ -3586,22 +3636,22 @@ int mb_reset(mb_interpreter_t** s, bool_t clrf/* = false*/) { return result; } -int mb_register_func(mb_interpreter_t* s, const char* n, mb_func_t f) { +int mb_register_func(struct mb_interpreter_t* s, const char* n, mb_func_t f) { /* Register a remote function to a MY-BASIC environment */ return _register_func(s, n, f, false); } -int mb_remove_func(mb_interpreter_t* s, const char* n) { +int mb_remove_func(struct mb_interpreter_t* s, const char* n) { /* Remove a remote function from a MY-BASIC environment */ return _remove_func(s, n, false); } -int mb_remove_reserved_func(mb_interpreter_t* s, const char* n) { +int mb_remove_reserved_func(struct mb_interpreter_t* s, const char* n) { /* Remove a reserved remote function from a MY-BASIC environment */ return _remove_func(s, n, true); } -int mb_attempt_func_begin(mb_interpreter_t* s, void** l) { +int mb_attempt_func_begin(struct mb_interpreter_t* s, void** l) { /* Try attempting to begin a function */ int result = MB_FUNC_OK; _ls_node_t* ast = 0; @@ -3617,7 +3667,7 @@ int mb_attempt_func_begin(mb_interpreter_t* s, void** l) { } ast = ast->next; - running = (_running_context_t*)(s->running_context); + running = s->running_context; ++running->no_eat_comma_mark; _exit: @@ -3626,20 +3676,20 @@ _exit: return result; } -int mb_attempt_func_end(mb_interpreter_t* s, void** l) { +int mb_attempt_func_end(struct mb_interpreter_t* s, void** l) { /* Try attempting to end a function */ int result = MB_FUNC_OK; _running_context_t* running = 0; mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; --running->no_eat_comma_mark; return result; } -int mb_attempt_open_bracket(mb_interpreter_t* s, void** l) { +int mb_attempt_open_bracket(struct mb_interpreter_t* s, void** l) { /* Try attempting an open bracket */ int result = MB_FUNC_OK; _ls_node_t* ast = 0; @@ -3661,7 +3711,7 @@ _exit: return result; } -int mb_attempt_close_bracket(mb_interpreter_t* s, void** l) { +int mb_attempt_close_bracket(struct mb_interpreter_t* s, void** l) { /* Try attempting a close bracket */ int result = MB_FUNC_OK; _ls_node_t* ast = 0; @@ -3670,6 +3720,9 @@ int mb_attempt_close_bracket(mb_interpreter_t* s, void** l) { mb_assert(s && l); ast = (_ls_node_t*)(*l); + if(!ast) { + _handle_error_on_obj(s, SE_RN_CLOSE_BRACKET_EXPECTED, DON(ast), MB_FUNC_ERR, _exit, result); + } obj = (_object_t*)(ast->data); if(!(obj->type == _DT_FUNC && obj->data.func->pointer == _core_close_bracket)) { _handle_error_on_obj(s, SE_RN_CLOSE_BRACKET_EXPECTED, DON(ast), MB_FUNC_ERR, _exit, result); @@ -3682,7 +3735,26 @@ _exit: return result; } -int mb_pop_int(mb_interpreter_t* s, void** l, int_t* val) { +int mb_has_arg(struct mb_interpreter_t* s, void** l) { + /* Detect whether there is any more argument */ + int result = 0; + _ls_node_t* ast = 0; + _object_t* obj = 0; + + mb_assert(s && l); + + ast = (_ls_node_t*)(*l); + if(ast) { + obj = (_object_t*)(ast->data); + if(!(obj->type == _DT_FUNC && obj->data.func->pointer == _core_close_bracket) && obj->type != _DT_EOS) { + result = obj->data.integer; + } + } + + return result; +} + +int mb_pop_int(struct mb_interpreter_t* s, void** l, int_t* val) { /* Pop an integer argument */ int result = MB_FUNC_OK; mb_value_t arg; @@ -3713,7 +3785,7 @@ _exit: return result; } -int mb_pop_real(mb_interpreter_t* s, void** l, real_t* val) { +int mb_pop_real(struct mb_interpreter_t* s, void** l, real_t* val) { /* Pop a float point argument */ int result = MB_FUNC_OK; mb_value_t arg; @@ -3744,7 +3816,7 @@ _exit: return result; } -int mb_pop_string(mb_interpreter_t* s, void** l, char** val) { +int mb_pop_string(struct mb_interpreter_t* s, void** l, char** val) { /* Pop a string argument */ int result = MB_FUNC_OK; mb_value_t arg; @@ -3771,7 +3843,7 @@ _exit: return result; } -int mb_pop_value(mb_interpreter_t* s, void** l, mb_value_t* val) { +int mb_pop_value(struct mb_interpreter_t* s, void** l, mb_value_t* val) { /* Pop an argument */ int result = MB_FUNC_OK; _ls_node_t* ast = 0; @@ -3782,7 +3854,7 @@ int mb_pop_value(mb_interpreter_t* s, void** l, mb_value_t* val) { mb_assert(s && l && val); - running = (_running_context_t*)(s->running_context); + running = s->running_context; if(!_ls_empty(running->in_neg_expr)) inep = (int*)_ls_back(running->in_neg_expr)->data; @@ -3819,7 +3891,7 @@ _exit: return result; } -int mb_push_int(mb_interpreter_t* s, void** l, int_t val) { +int mb_push_int(struct mb_interpreter_t* s, void** l, int_t val) { /* Push an integer argument */ int result = MB_FUNC_OK; mb_value_t arg; @@ -3833,7 +3905,7 @@ int mb_push_int(mb_interpreter_t* s, void** l, int_t val) { return result; } -int mb_push_real(mb_interpreter_t* s, void** l, real_t val) { +int mb_push_real(struct mb_interpreter_t* s, void** l, real_t val) { /* Push a float point argument */ int result = MB_FUNC_OK; mb_value_t arg; @@ -3847,7 +3919,7 @@ int mb_push_real(mb_interpreter_t* s, void** l, real_t val) { return result; } -int mb_push_string(mb_interpreter_t* s, void** l, char* val) { +int mb_push_string(struct mb_interpreter_t* s, void** l, char* val) { /* Push a string argument */ int result = MB_FUNC_OK; mb_value_t arg; @@ -3861,20 +3933,20 @@ int mb_push_string(mb_interpreter_t* s, void** l, char* val) { return result; } -int mb_push_value(mb_interpreter_t* s, void** l, mb_value_t val) { +int mb_push_value(struct mb_interpreter_t* s, void** l, mb_value_t val) { /* Push an argument */ int result = MB_FUNC_OK; _running_context_t* running = 0; mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; running->intermediate_value = val; return result; } -int mb_load_string(mb_interpreter_t* s, const char* l) { +int mb_load_string(struct mb_interpreter_t* s, const char* l) { /* Load a script string */ int result = MB_FUNC_OK; char ch = 0; @@ -3889,7 +3961,7 @@ int mb_load_string(mb_interpreter_t* s, const char* l) { mb_assert(s && s->parsing_context); - context = (_parsing_context_t*)(s->parsing_context); + context = s->parsing_context; while(l[i]) { ch = l[i]; @@ -3927,7 +3999,7 @@ _exit: return result; } -int mb_load_file(mb_interpreter_t* s, const char* f) { +int mb_load_file(struct mb_interpreter_t* s, const char* f) { /* Load a script file */ int result = MB_FUNC_OK; FILE* fp = 0; @@ -3938,7 +4010,7 @@ int mb_load_file(mb_interpreter_t* s, const char* f) { mb_assert(s && s->parsing_context); - context = (_parsing_context_t*)(s->parsing_context); + context = s->parsing_context; fp = fopen(f, "rb"); if(fp) { @@ -3970,13 +4042,15 @@ _exit: return result; } -int mb_run(mb_interpreter_t* s) { +int mb_run(struct mb_interpreter_t* s) { /* Run loaded and parsed script */ int result = MB_FUNC_OK; _ls_node_t* ast = 0; _running_context_t* running = 0; - running = (_running_context_t*)(s->running_context); + running = s->running_context; + + safe_free(s->parsing_context); if(running->suspent_point) { ast = running->suspent_point; @@ -3984,7 +4058,7 @@ int mb_run(mb_interpreter_t* s) { running->suspent_point = 0; } else { mb_assert(!running->no_eat_comma_mark); - ast = (_ls_node_t*)(s->ast); + ast = s->ast; ast = ast->next; if(!ast) { _set_current_error(s, SE_RN_EMPTY_PROGRAM); @@ -4025,7 +4099,7 @@ _exit: return result; } -int mb_suspend(mb_interpreter_t* s, void** l) { +int mb_suspend(struct mb_interpreter_t* s, void** l) { /* Suspend current execution and save the context */ int result = MB_FUNC_OK; _ls_node_t* ast; @@ -4033,12 +4107,12 @@ int mb_suspend(mb_interpreter_t* s, void** l) { mb_assert(s && l && *l); ast = (_ls_node_t*)(*l); - ((_running_context_t*)(s->running_context))->suspent_point = ast; + s->running_context->suspent_point = ast; return result; } -mb_error_e mb_get_last_error(mb_interpreter_t* s) { +mb_error_e mb_get_last_error(struct mb_interpreter_t* s) { /* Get last error information */ mb_error_e result = SE_NO_ERR; @@ -4055,7 +4129,7 @@ const char* mb_get_error_desc(mb_error_e err) { return _get_error_desc(err); } -int mb_set_error_handler(mb_interpreter_t* s, mb_error_handler_t h) { +int mb_set_error_handler(struct mb_interpreter_t* s, mb_error_handler_t h) { /* Set an error handler to an interpreter instance */ int result = MB_FUNC_OK; @@ -4066,7 +4140,7 @@ int mb_set_error_handler(mb_interpreter_t* s, mb_error_handler_t h) { return result; } -int mb_set_printer(mb_interpreter_t* s, mb_print_func_t p) { +int mb_set_printer(struct mb_interpreter_t* s, mb_print_func_t p) { /* Set a print functor to an interpreter instance */ int result = MB_FUNC_OK; @@ -4077,7 +4151,7 @@ int mb_set_printer(mb_interpreter_t* s, mb_print_func_t p) { return result; } -int mb_set_inputer(mb_interpreter_t* s, mb_input_func_t p) { +int mb_set_inputer(struct mb_interpreter_t* s, mb_input_func_t p) { /* Set an input functor to an interpreter instance */ int result = MB_FUNC_OK; @@ -4246,7 +4320,7 @@ int _core_neg(mb_interpreter_t* s, void** l) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; if(!_ls_empty(running->in_neg_expr)) { inep = (int*)_ls_back(running->in_neg_expr)->data; @@ -4671,7 +4745,7 @@ int _core_if(mb_interpreter_t* s, void** l) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ast = (_ls_node_t*)(*l); ast = ast->next; @@ -4788,7 +4862,7 @@ int _core_for(mb_interpreter_t* s, void** l) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ast = (_ls_node_t*)(*l); ast = ast->next; @@ -4935,7 +5009,7 @@ int _core_next(mb_interpreter_t* s, void** l) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ast = (_ls_node_t*)(*l); result = MB_LOOP_CONTINUE; @@ -5143,7 +5217,7 @@ int _core_goto(mb_interpreter_t* s, void** l) { label = (_label_t*)(obj->data.label); if(!label->node) { - glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, label->name); + glbsyminscope = _ht_find(s->global_var_dict, label->name); if(!(glbsyminscope && ((_object_t*)(glbsyminscope->data))->type == _DT_LABEL)) { _handle_error_on_obj(s, SE_RN_LABEL_NOT_EXISTS, DON(ast), MB_FUNC_ERR, _exit, result); } @@ -5167,7 +5241,7 @@ int _core_gosub(mb_interpreter_t* s, void** l) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ast = (_ls_node_t*)(*l); result = _core_goto(s, l); if(result == MB_FUNC_OK) { @@ -5185,7 +5259,7 @@ int _core_return(mb_interpreter_t* s, void** l) { mb_assert(s && l); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ast = (_ls_node_t*)_ls_popback(running->sub_stack); if(!ast) { _handle_error_on_obj(s, SE_RN_NO_RETURN_POINT, DON(ast), MB_FUNC_ERR, _exit, result); @@ -5944,7 +6018,7 @@ int _std_print(mb_interpreter_t* s, void** l) { val_ptr = &val_obj; memset(val_ptr, 0, sizeof(_object_t)); - running = (_running_context_t*)(s->running_context); + running = s->running_context; ++running->no_eat_comma_mark; ast = (_ls_node_t*)(*l); ast = ast->next; diff --git a/core/my_basic.h b/core/my_basic.h index f5582af..4b85848 100755 --- a/core/my_basic.h +++ b/core/my_basic.h @@ -34,6 +34,10 @@ extern "C" { # define MBAPI #endif /* MBAPI */ +#ifndef MB_ENABLE_SOURCE_TRACE +# define MB_ENABLE_SOURCE_TRACE +#endif /* MB_ENABLE_SOURCE_TRACE */ + #ifndef MB_COMPACT_MODE # define MB_COMPACT_MODE #endif /* MB_COMPACT_MODE */ @@ -198,59 +202,43 @@ typedef int (* mb_func_t)(struct mb_interpreter_t*, void**); typedef int (* mb_print_func_t)(const char*, ...); typedef int (* mb_input_func_t)(char*, int); -typedef struct mb_interpreter_t { - void* local_func_dict; - void* global_func_dict; - void* global_var_dict; - void* ast; - void* parsing_context; - void* running_context; - mb_error_e last_error; - int last_error_pos; - unsigned short last_error_row; - unsigned short last_error_col; - mb_error_handler_t error_handler; - mb_print_func_t printer; - mb_input_func_t inputer; - void* userdata; -} mb_interpreter_t; - MBAPI unsigned int mb_ver(void); MBAPI const char* mb_ver_string(void); MBAPI int mb_init(void); MBAPI int mb_dispose(void); -MBAPI int mb_open(mb_interpreter_t** s); -MBAPI int mb_close(mb_interpreter_t** s); -MBAPI int mb_reset(mb_interpreter_t** s, bool_t clrf); +MBAPI int mb_open(struct mb_interpreter_t** s); +MBAPI int mb_close(struct mb_interpreter_t** s); +MBAPI int mb_reset(struct mb_interpreter_t** s, bool_t clrf); -MBAPI int mb_register_func(mb_interpreter_t* s, const char* n, mb_func_t f); -MBAPI int mb_remove_func(mb_interpreter_t* s, const char* n); -MBAPI int mb_remove_reserved_func(mb_interpreter_t* s, const char* n); +MBAPI int mb_register_func(struct mb_interpreter_t* s, const char* n, mb_func_t f); +MBAPI int mb_remove_func(struct mb_interpreter_t* s, const char* n); +MBAPI int mb_remove_reserved_func(struct mb_interpreter_t* s, const char* n); -MBAPI int mb_attempt_func_begin(mb_interpreter_t* s, void** l); -MBAPI int mb_attempt_func_end(mb_interpreter_t* s, void** l); -MBAPI int mb_attempt_open_bracket(mb_interpreter_t* s, void** l); -MBAPI int mb_attempt_close_bracket(mb_interpreter_t* s, void** l); -MBAPI int mb_pop_int(mb_interpreter_t* s, void** l, int_t* val); -MBAPI int mb_pop_real(mb_interpreter_t* s, void** l, real_t* val); -MBAPI int mb_pop_string(mb_interpreter_t* s, void** l, char** val); -MBAPI int mb_pop_value(mb_interpreter_t* s, void** l, mb_value_t* val); -MBAPI int mb_push_int(mb_interpreter_t* s, void** l, int_t val); -MBAPI int mb_push_real(mb_interpreter_t* s, void** l, real_t val); -MBAPI int mb_push_string(mb_interpreter_t* s, void** l, char* val); -MBAPI int mb_push_value(mb_interpreter_t* s, void** l, mb_value_t val); +MBAPI int mb_attempt_func_begin(struct mb_interpreter_t* s, void** l); +MBAPI int mb_attempt_func_end(struct mb_interpreter_t* s, void** l); +MBAPI int mb_attempt_open_bracket(struct mb_interpreter_t* s, void** l); +MBAPI int mb_attempt_close_bracket(struct mb_interpreter_t* s, void** l); +MBAPI int mb_has_arg(struct mb_interpreter_t* s, void** l); +MBAPI int mb_pop_int(struct mb_interpreter_t* s, void** l, int_t* val); +MBAPI int mb_pop_real(struct mb_interpreter_t* s, void** l, real_t* val); +MBAPI int mb_pop_string(struct mb_interpreter_t* s, void** l, char** val); +MBAPI int mb_pop_value(struct mb_interpreter_t* s, void** l, mb_value_t* val); +MBAPI int mb_push_int(struct mb_interpreter_t* s, void** l, int_t val); +MBAPI int mb_push_real(struct mb_interpreter_t* s, void** l, real_t val); +MBAPI int mb_push_string(struct mb_interpreter_t* s, void** l, char* val); +MBAPI int mb_push_value(struct mb_interpreter_t* s, void** l, mb_value_t val); -MBAPI int mb_load_string(mb_interpreter_t* s, const char* l); -MBAPI int mb_load_file(mb_interpreter_t* s, const char* f); -MBAPI int mb_run(mb_interpreter_t* s); -MBAPI int mb_suspend(mb_interpreter_t* s, void** l); +MBAPI int mb_load_string(struct mb_interpreter_t* s, const char* l); +MBAPI int mb_load_file(struct mb_interpreter_t* s, const char* f); +MBAPI int mb_run(struct mb_interpreter_t* s); +MBAPI int mb_suspend(struct mb_interpreter_t* s, void** l); -MBAPI mb_error_e mb_get_last_error(mb_interpreter_t* s); +MBAPI mb_error_e mb_get_last_error(struct mb_interpreter_t* s); MBAPI const char* mb_get_error_desc(mb_error_e err); -MBAPI int mb_set_error_handler(mb_interpreter_t* s, mb_error_handler_t h); -MBAPI int mb_set_printer(mb_interpreter_t* s, mb_print_func_t p); -MBAPI int mb_set_inputer(mb_interpreter_t* s, mb_input_func_t p); +MBAPI int mb_set_error_handler(struct mb_interpreter_t* s, mb_error_handler_t h); +MBAPI int mb_set_printer(struct mb_interpreter_t* s, mb_print_func_t p); +MBAPI int mb_set_inputer(struct mb_interpreter_t* s, mb_input_func_t p); MBAPI int mb_gets(char* buf, int s); diff --git a/output/my_basic_mac b/output/my_basic_mac index 66e413aff56226f540142007df835ca566e363a9..32191aa84deda7158c9b59bf7627941859b7fc8f 100755 GIT binary patch delta 21814 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�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