diff --git a/src/builtin.cmod b/src/builtin.cmod index 1eb0fa46f6a6f4ea4ec69764962913cd39aa36f6..580b251992019c623fa4b071c4bd7613c6df524a 100644 --- a/src/builtin.cmod +++ b/src/builtin.cmod @@ -2807,7 +2807,12 @@ void low_backtrace(struct Pike_interpreter_struct *i) if(of && of->locals) { /* f->num_args can be too large, so this is necessary for some - * reason. I don't know why. /mast */ + * reason. I don't know why. /mast + * + * possibly because f->num_args was uninitialized for c_initializers + * /arne + * */ + numargs = DO_NOT_WARN((INT32)MINIMUM(f->num_args,of->locals - f->locals)); } diff --git a/src/object.c b/src/object.c index 1f0c30f4a63ae5070f4798d55db1edadbd59b57e..089bb895a5adb0ad8e3b1143419bad4be76d719f 100644 --- a/src/object.c +++ b/src/object.c @@ -265,6 +265,7 @@ PMOD_EXPORT void call_c_initializers(struct object *o) if( !frame_pushed ) { PUSH_FRAME2(o, p); + Pike_fp->num_args = 0; frame_pushed = 1; } SET_FRAME_CONTEXT(p->inherits + e); diff --git a/src/program.c b/src/program.c index ffac06ea9b7c4ecee76724ea706c186eda079c70..20f96262711ee3977243cdcbcc22465b30bf2508 100644 --- a/src/program.c +++ b/src/program.c @@ -9967,6 +9967,7 @@ static void low_enter_compiler(struct object *ce, int inherit) new_frame->save_mark_sp = Pike_mark_sp; new_frame->mark_sp_base = Pike_mark_sp; new_frame->args = 0; + new_frame->num_args = 0; new_frame->num_locals = 0; new_frame->pc = 0; new_frame->return_addr = 0;