From: Peep P. <so...@us...> - 2004-03-16 14:21:25
|
Update of /cvsroot/agd/server/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7466 Modified Files: interpret.c Log Message: Removed comments; index overrun checking only done inside F_JMP and F_JMPF. Index: interpret.c =================================================================== RCS file: /cvsroot/agd/server/src/interpret.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- interpret.c 15 Mar 2004 18:44:53 -0000 1.10 +++ interpret.c 16 Mar 2004 14:12:07 -0000 1.11 @@ -70,7 +70,6 @@ out: stop_execution = 1; /* longjmp(error_context, 1);*/ -/* csp = &control_stack[0]; */ } int get_fun_index(object_t *ob, char *fun) @@ -148,19 +147,8 @@ } } -/*#define pop_locals() if(sp - 1 >= fp) \ - while(1) { if(sp == fp) break; free_value(sp); sp--; }*/ #define pop_locals() while(sp > fp) { sp--; free_value(sp); } -/*void pop_arguments(void) -{ - int i; - for(i=0;i<csp->num_arg;i++) { - pop_stack(); - } -}*/ - - void do_assign(variable_t *lval, variable_t *rval) { *lval = *rval; @@ -178,11 +166,6 @@ void do_assign_free(variable_t *lval, variable_t *rval) { -/* if(lval->type == T_LVALUE) - lval = lval->u.v; - if(rval->type == T_LVALUE) - rval = rval->u.v;*/ - free_value(lval); do_assign(lval, rval); } @@ -268,6 +251,10 @@ } } +/* Used by F_JMP and F_JMPF to check if they jumped too far. */ +#define CHECK_OVERRUN() if((int *) cp >= (int *) code->data + code->length) {\ + debug("interpret", "Ran over end of array: returning\n"); return; } + #define GET_ARGS() tmpi = 0; while(tmpi < 2) { \ tmp = --sp; if(tmp->type == T_LVALUE) tmp = tmp->u.v;\ arg[tmpi] = tmp->u.i; tmpi++; free_value(sp); } @@ -300,10 +287,6 @@ case F_PUSH_NULL_OBJECT: push_object(NULL); break; -/* case F_PUSH: - cp++; - push_var((variable_t*)*cp); - break;*/ case F_POP: pop_stack(); break; @@ -324,12 +307,12 @@ break; case F_PUSH_GVAR: cp++; - push_var(this_ob/*->prog*/->variables.data[*cp]); + push_var(this_ob->variables.data[*cp]); break; case F_PUSH_GVAR_LVALUE: cp++; sp->type = T_LVALUE; - sp->u.v = this_ob/*->prog*/->variables.data[*cp]; + sp->u.v = this_ob->variables.data[*cp]; sp++; CHECK_SP() break; @@ -364,28 +347,26 @@ } break; case F_POSTINC: - sp--; - tmp = sp->u.v; - push_int(tmp->u.i); - tmp->u.i++; + tmp = sp[-1].u.v; + tmpi = tmp->u.i++; + pop_stack(); + push_int(tmpi); break; case F_PREINC: - sp--; - tmp = sp->u.v; - tmp->u.i++; - push_int(tmp->u.i); + tmp = sp[-1].u.v; + tmpi = ++tmp->u.i; + pop_stack(); + push_int(tmpi); break; case F_POSTDEC: - sp--; - tmp = sp->u.v; - push_int(tmp->u.i); - tmp->u.i--; + tmp = sp[-1].u.v; + tmpi = tmp->u.i--; + push_int(tmpi); break; case F_PREDEC: - sp--; - tmp = sp->u.v; - tmp->u.i--; - push_int(tmp->u.i); + tmp = sp[-1].u.v; + tmpi = --tmp->u.i; + push_int(tmpi); break; case F_JMPF: sp--; @@ -396,10 +377,12 @@ cp++; } free_value(sp); + CHECK_OVERRUN() break; case F_JMP: tmpi = cp[1]; cp += tmpi; + CHECK_OVERRUN() break; case F_NEG: sp--; @@ -423,18 +406,6 @@ push_int(0); } break; -#if 0 - case F_AND: - tmpi = test_var(sp-2) && test_var(sp-1); - pop_stack(); pop_stack(); - push_int(tmpi); - break; - case F_OR: - tmpi = test_var(sp-2) || test_var(sp-1); - pop_stack(); pop_stack(); - push_int(tmpi); - break; -#endif case F_NOT: sp--; tmpi = test_var(sp); @@ -532,11 +503,7 @@ pop_locals(); return; } - /* Should only check this with F_JMP. */ - if((int *) ++cp >= (int *) code->data + code->length) { - debug("interpret", "Ran over end of array: returning\n"); - return; - } + cp++; goto again; } @@ -573,9 +540,7 @@ cp = (int *) &f->code.data[0]; code = &f->code; -/* eval_instruction(); - - funcno = 0;*/ +/* funcno = 0;*/ } void init_interpreter(void) @@ -606,7 +571,6 @@ struct timeval tm, tm2; #endif -/* index = nametable_find(TYPE_FUN|SCOPE_LOCAL, fun, &ob->prog->nametable);*/ index = get_fun_index(ob, fun); if(index == -1) return NULL; @@ -615,13 +579,9 @@ gettimeofday(&tm, NULL); #endif -/* init_interpreter();*/ push_control_stack(); -/* fp = ++sp;*/ va_start(va, argfmt); - -/* sp = fp;*/ for(p=argfmt;p && *p;p++) { switch(*p) { case 'o': |