Update of /cvsroot/agd/server/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19711
Modified Files:
interpret.c
Log Message:
Fixed F_RETURN and F_CALL_OTHER.
Index: interpret.c
===================================================================
RCS file: /cvsroot/agd/server/src/interpret.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** interpret.c 12 Mar 2004 08:40:10 -0000 1.8
--- interpret.c 12 Mar 2004 13:50:53 -0000 1.9
***************
*** 234,238 ****
csp->this_ob = this_ob;
csp->fp = fp;
! /* csp->sp = sp;*/
csp->cp = cp;
csp->code = code;
--- 234,238 ----
csp->this_ob = this_ob;
csp->fp = fp;
! csp->sp = sp;
csp->cp = cp;
csp->code = code;
***************
*** 241,245 ****
}
! void pop_control_stack(void)
{
csp--;
--- 241,245 ----
}
! void pop_control_stack(int pop_sp)
{
csp--;
***************
*** 250,254 ****
fp = csp->fp;
! /* sp = csp->sp;*/
cp = csp->cp;
code = csp->code;
--- 250,255 ----
fp = csp->fp;
! if(pop_sp)
! sp = csp->sp;
cp = csp->cp;
code = csp->code;
***************
*** 277,282 ****
--- 278,286 ----
{
variable_t *tmp;
+ control_stack_t *saved_csp;
int tmpi, arg[2];
+ /* csp is never at &control_stack[0] when we get here, so this is safe. */
+ saved_csp = csp - 1;
again:
#ifdef DEBUG
***************
*** 470,474 ****
remove_lvalues();
dfptr[tmpi]();
! pop_control_stack();
break;
case F_CALL_OTHER:
--- 474,478 ----
remove_lvalues();
dfptr[tmpi]();
! pop_control_stack(0);
break;
case F_CALL_OTHER:
***************
*** 480,486 ****
name = (char *) *++cp;
! csp->num_arg = *++cp;
ref = sp-1;
! if(ref->type = T_LVALUE)
ref = ref->u.v;
ob = ref->u.ob;
--- 484,490 ----
name = (char *) *++cp;
! ++cp;
ref = sp-1;
! if(ref->type == T_LVALUE)
ref = ref->u.v;
ob = ref->u.ob;
***************
*** 489,502 ****
return;
}
! #if 0
! index = nametable_find(TYPE_FUN|SCOPE_LOCAL, name, &ob->prog->nametable);
! if(index == -1) {
! runtime("function not found in called object");
! return;
! }
! #endif
push_control_stack();
call_function(ob, index);
! /* pop_control_stack();*/
}
break;
--- 493,504 ----
return;
}
!
! show_stack();
! index = get_fun_index(ob, name);
push_control_stack();
+ csp->num_arg = *cp;
+ fp = sp - csp->num_arg;
call_function(ob, index);
! eval_instruction();
}
break;
***************
*** 504,513 ****
{
variable_t tmp;
! tmp = *sp;
pop_stack();
pop_arguments();
pop_locals();
push_var(&tmp);
! pop_control_stack();
}
break;
--- 506,515 ----
{
variable_t tmp;
! tmp = sp[-1];
pop_stack();
pop_arguments();
pop_locals();
push_var(&tmp);
! pop_control_stack(1);
}
break;
***************
*** 520,524 ****
show_stack();
#endif
! if(csp == &control_stack[0] || stop_execution
|| this_ob->flags & O_DESTRUCTED)
return;
--- 522,527 ----
show_stack();
#endif
! /* We return to the control level where we entered - we have finished. */
! if(csp == saved_csp /*&control_stack[0]*/ || stop_execution
|| this_ob->flags & O_DESTRUCTED)
return;
***************
*** 538,542 ****
f = ob->prog->functions.data[index];
if(!f) {
! runtime("function doesn't exist");
return;
}
--- 541,547 ----
f = ob->prog->functions.data[index];
if(!f) {
! char buf[256];
! sprintf(buf, "function %d doesn't exist in object \"%s\"", index, ob->name);
! runtime(buf);
return;
}
***************
*** 629,633 ****
va_end(va);
pop_locals()
! pop_control_stack();
return NULL;
}
--- 634,638 ----
va_end(va);
pop_locals()
! pop_control_stack(1);
return NULL;
}
|