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;