diff --git a/src/program.c b/src/program.c
index 6c1ca143355dad68fb91ceca1bc7ffd64ddd3f70..f13d7bdc7f81d30ac1d4f7a8c23e217431740480 100644
--- a/src/program.c
+++ b/src/program.c
@@ -2,11 +2,11 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: program.c,v 1.503 2003/06/03 18:02:28 mast Exp $
+|| $Id: program.c,v 1.504 2003/06/04 09:09:23 grubba Exp $
 */
 
 #include "global.h"
-RCSID("$Id: program.c,v 1.503 2003/06/03 18:02:28 mast Exp $");
+RCSID("$Id: program.c,v 1.504 2003/06/04 09:09:23 grubba Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -1844,12 +1844,10 @@ void low_start_new_program(struct program *p,
 	      compilation_depth);
 #endif
     }
-    if(compilation_depth >= 1)
-      add_ref(p->parent = Pike_compiler->new_program);
   }else{
     tmp.u.program=p;
     add_ref(p);
-    if(name)
+    if((pass == 2) && name)
     {
       struct identifier *i;
       id=isidentifier(name);
@@ -1860,6 +1858,10 @@ void low_start_new_program(struct program *p,
       i->type=get_type_of_svalue(&tmp);
     }
   }
+  if (pass == 1) {
+    if(compilation_depth >= 1)
+      add_ref(p->parent = Pike_compiler->new_program);
+  }
   p->flags &=~ PROGRAM_VIRGIN;
   Pike_compiler->parent_identifier=id;
   if(idp) *idp=id;
@@ -2321,6 +2323,11 @@ void dump_program_tables (struct program *p, int indent)
 {
   int d;
 
+  if (!p) {
+    fprintf(stderr, "%*sProgram: NULL\n\n", indent, "");
+    return;
+  }
+
   fprintf(stderr,
 	  "%*sProgram flags: 0x%04x\n\n",
 	  indent, "", p->flags);
@@ -3910,6 +3917,7 @@ int define_variable(struct pike_string *name,
 			low_add_storage(sizeof_variable(run_time_type),
 					alignof_variable(run_time_type),0),
 			run_time_type);
+
   ID_FROM_INT(Pike_compiler->new_program, n)->identifier_flags |= IDENTIFIER_NO_THIS_REF;
 
   return n;
@@ -4509,6 +4517,34 @@ make_a_new_def:
   return i;
 }
 
+#if 0
+
+int add_ext_ref(struct program_state *state, struct program *target, int i)
+{
+  struct reference ref, *r;
+  int j;
+  if (state->new_program == target) return i;
+  i = add_ext_ref(state->previous, target, i);
+  for (r = state->new_program->identifier_references, j = 0;
+       j < state->new_program->num_identifier_references;
+       j++, r++) {
+    if (((r->id_flags & ID_PARENT_REF|ID_STATIC|ID_PRIVATE|ID_HIDDEN) ==
+	 ID_PARENT_REF|ID_STATIC|ID_PRIVATE|ID_HIDDEN) &&
+	(r->identifier_offset == i) &&
+	(!(r->inherit_offset))) {
+      return j;
+    }
+  }
+  ref.id_flags = ID_PARENT_REF|ID_STATIC|ID_PRIVATE|ID_HIDDEN;
+  ref.identifier_offset = i;
+  ref.inherit_offset = 0;
+  add_to_identifier_references(ref);
+  state->new_program->flags |= PROGRAM_USES_PARENT | PROGRAM_NEEDS_PARENT;
+  return j;
+}
+
+#endif /* 0 */
+
 /* Identifier lookup
  *
  * The search algorithm has changed several times during Pike 7.3.