*fixed a crash bug when re-entry a script

This commit is contained in:
Wang Renxin 2015-06-18 11:25:57 +08:00
parent 3e10389428
commit 69bd7780a2

View File

@ -694,6 +694,8 @@ static int _skip_to(mb_interpreter_t* s, _ls_node_t** l, mb_func_t f, _data_e t)
static int _skip_if_chunk(mb_interpreter_t* s, _ls_node_t** l);
static int _skip_struct(mb_interpreter_t* s, _ls_node_t** l, mb_func_t open_func, mb_func_t close_func);
static _parsing_context_t* _reset_parsing_context(_parsing_context_t* context);
static int _register_func(mb_interpreter_t* s, const char* n, mb_func_t f, bool_t local);
static int _remove_func(mb_interpreter_t* s, const char* n, bool_t local);
@ -3057,6 +3059,15 @@ _exit:
return result;
}
_parsing_context_t* _reset_parsing_context(_parsing_context_t* context) {
if(!context)
context = (_parsing_context_t*)mb_malloc(sizeof(_parsing_context_t));
memset(context, 0, sizeof(_parsing_context_t));
context->parsing_row = 1;
return context;
}
int _register_func(mb_interpreter_t* s, const char* n, mb_func_t f, bool_t local) {
/* Register a function to a MY-BASIC environment */
int result = 0;
@ -3315,10 +3326,7 @@ int mb_open(struct mb_interpreter_t** s) {
ast = _ls_create();
(*s)->ast = ast;
context = (_parsing_context_t*)mb_malloc(sizeof(_parsing_context_t));
memset(context, 0, sizeof(_parsing_context_t));
context->parsing_row = 1;
(*s)->parsing_context = context;
(*s)->parsing_context = context = _reset_parsing_context(context);
running = (_running_context_t*)mb_malloc(sizeof(_running_context_t));
memset(running, 0, sizeof(_running_context_t));
@ -3410,14 +3418,7 @@ int mb_reset(struct mb_interpreter_t** s, bool_t clrf/* = false*/) {
running->no_eat_comma_mark = 0;
memset(&(running->intermediate_value), 0, sizeof(mb_value_t));
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));
context->parsing_row = 1;
(*s)->parsing_context = context = _reset_parsing_context(context);
ast = (*s)->ast;
_ls_foreach(ast, _destroy_object);
@ -3859,10 +3860,12 @@ int mb_load_file(struct mb_interpreter_t* s, const char* f) {
long l = 0;
_parsing_context_t* context = 0;
mb_assert(s && s->parsing_context);
mb_assert(s);
context = s->parsing_context;
s->parsing_context = context = _reset_parsing_context(context);
fp = fopen(f, "rb");
if(fp) {
curpos = ftell(fp);