diff --git a/src/program.c b/src/program.c
index 7dc8fdbeac3c175a8d0a3089fa9387ec88e71057..ac2bcb35425ac18fdd73fdd3c5c6373f6bf425aa 100644
--- a/src/program.c
+++ b/src/program.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: program.c,v 1.389 2001/12/13 11:05:57 mast Exp $");
+RCSID("$Id: program.c,v 1.390 2001/12/14 04:09:07 mast Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -2536,8 +2536,10 @@ void low_inherit(struct program *p,
   struct inherit inherit;
 
 #if 0
-  fprintf(stderr,"LOW_INHERIT(pid=%d, parent=%p, parid=%d, paroff=%d, flags=0x%x, name=%s);\n",
-	  p->id,
+  fprintf(stderr,"%p low_inherit(pid=%d, parent=%p, parid=%d, "
+	  "paroff=%d, flags=0x%x, name=%s);\n",
+	  Pike_compiler->new_program,
+	  p ? p->id : 0,
 	  parent,
 	  parent_identifier,
 	  parent_offset,
@@ -2551,6 +2553,11 @@ void low_inherit(struct program *p,
     return;
   }
 
+#ifdef PIKE_DEBUG
+  if (p == placeholder_program)
+    fatal("Trying to inherit placeholder_program.\n");
+#endif
+
   if(p->flags & PROGRAM_NEEDS_PARENT)
   {
     struct program_state *state=Pike_compiler;
@@ -2562,7 +2569,7 @@ void low_inherit(struct program *p,
     }
 
 #if 0
-    /* FIXME: we don't really need to set thsi flag on ALL
+    /* FIXME: we don't really need to set this flag on ALL
      * previous compilations, but I'm too lazy to figure out
      * exactly how deep down we need to go...
      */
@@ -4442,6 +4449,7 @@ extern void yyparse(void);
 #endif
 
 struct Supporter *current_supporter=0;
+int force_resolve = 0;
 
 
 #ifdef PIKE_DEBUG
@@ -4506,15 +4514,14 @@ static void low_verify_supporters(struct Supporter *s)
   if(m->verified) return;
   m->verified = 1;
 
-  low_verify_supporters(s->previous);
-  low_verify_supporters(s->depends_on);
   low_verify_supporters(s->dependants);
   low_verify_supporters(s->next_dependant);
 
 #if 0
-  fprintf(stderr, "low_verify_supporters %p, level %d: "
+  fprintf(stderr, "low_verify_supporters %p%s, level %d: "
 	  "previous %p, depends_on %p, dependants %p, next_dependant %p\n",
-	  s, m->level, s->previous, s->depends_on, s->dependants, s->next_dependant);
+	  s, s == current_supporter ? " == current_supporter" : "",
+	  m->level, s->previous, s->depends_on, s->dependants, s->next_dependant);
 #endif
 
   if(s->previous && SNUM(s->previous) <= m->level)
@@ -4523,9 +4530,15 @@ static void low_verify_supporters(struct Supporter *s)
   if(s->depends_on && SNUM(s->depends_on) <= m->level)
     fatal("Que, numbers out of whack2\n");
 
-  for(ss=s->dependants;ss;ss=ss->next_dependant)
+  for(ss=s->dependants;ss;ss=ss->next_dependant) {
+    if (ss->depends_on != s)
+      fatal("Dependant hasn't got depends_on set properly.\n");
     if(SNUM(ss) >= m->level)
       fatal("Que, numbers out of whack3\n");
+  }
+
+  low_verify_supporters(s->previous);
+  low_verify_supporters(s->depends_on);
 }
 
 void verify_supporters()
@@ -4592,16 +4605,32 @@ int unlink_current_supporter(struct Supporter *c)
   verify_supporters();
   if(c->depends_on)
   {
+#ifdef PIKE_DEBUG
+    struct Supporter *s;
+    for (s = c->depends_on->dependants; s; s = s->next_dependant)
+      if (s == c) fatal("Dependant already linked in.\n");
+#endif
     ret++;
     c->next_dependant = c->depends_on->dependants;
     c->depends_on->dependants=c;
-    c->depends_on=0;
   }
   current_supporter=c->previous;
   verify_supporters();
   return ret;
 }
 
+void free_supporter(struct Supporter *c)
+{
+  verify_supporters();
+  if (c->depends_on) {
+    struct Supporter **s;
+    for (s = &c->depends_on->dependants; *s; s = &(*s)->next_dependant)
+      if (*s == c) {*s = c->next_dependant; break;}
+    c->depends_on = 0;
+  }
+  verify_supporters();
+}
+
 int call_dependants(struct Supporter *s, int finish)
 {
   int ok = 1;
@@ -4625,6 +4654,7 @@ int report_compiler_dependency(struct program *p)
   int ret=0;
   struct Supporter *c,*cc;
   verify_supporters();
+  if (force_resolve) return 0;
   for(cc=current_supporter;cc;cc=cc->previous)
   {
     if(cc->prog &&
@@ -4678,6 +4708,7 @@ static void free_compilation(struct compilation *c)
   if(c->target) free_program(c->target);
   if(c->placeholder) free_object(c->placeholder);
   free_svalue(& c->default_module);
+  free_supporter(&c->supporter);
   free((char *)c);
   verify_supporters();
 }