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':
|