From: <so...@us...> - 2004-03-12 14:10:28
|
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; } |