diff --git a/src/array.h b/src/array.h
index 1521461953d14a7de3bb187ea0fada213b2f191b..45420bdf8193e22b5f29ca6bbc6154e344bc9f24 100644
--- a/src/array.h
+++ b/src/array.h
@@ -48,7 +48,7 @@ extern struct array empty_array;
 #define OP_SUB MINTERM(OP_TAKE_A,OP_SKIP_A ,OP_SKIP_B)
 
 
-#define free_array(V) do{ struct array *v_=(V); if(!--v_->refs) really_free_array(v_); }while(0)
+#define free_array(V) do{ struct array *v_=(V); debug_malloc_touch(v_); if(!--v_->refs) really_free_array(v_); }while(0)
 
 #define allocate_array(X) low_allocate_array((X),0)
 #define allocate_array_no_init(X,Y) low_allocate_array((X),(Y))
diff --git a/src/mapping.h b/src/mapping.h
index e077b9b6e55e0ab2c73b37b2aba0844c4198a19e..01dea81b24b2d61053c985ec6379873c2e65d063 100644
--- a/src/mapping.h
+++ b/src/mapping.h
@@ -23,7 +23,7 @@ extern struct mapping *first_mapping;
 #define m_ind_types(m) ((m)->ind_types)
 #define m_val_types(m) ((m)->val_types)
 
-#define free_mapping(M) do{ struct mapping *m_=(M); if(!--m_->refs) really_free_mapping(m_); }while(0)
+#define free_mapping(M) do{ struct mapping *m_=(M); debug_malloc_touch(m_); if(!--m_->refs) really_free_mapping(m_); }while(0)
 
 /* Prototypes begin here */
 struct keypair;
diff --git a/src/multiset.h b/src/multiset.h
index d9408e92a1573578f78041f0bbd91ed36d18853d..11b4740c83e21589332a572c467b729018d12463 100644
--- a/src/multiset.h
+++ b/src/multiset.h
@@ -17,7 +17,7 @@ struct multiset
 
 extern struct multiset *first_multiset;
 
-#define free_multiset(L) do{ struct multiset *l_=(L); if(!--l_->refs) really_free_multiset(l_); }while(0)
+#define free_multiset(L) do{ struct multiset *l_=(L); debug_malloc_touch(l_); if(!--l_->refs) really_free_multiset(l_); }while(0)
 
 #define l_sizeof(L) ((L)->ind->size)
 
diff --git a/src/object.c b/src/object.c
index 60d26241b3196fb5df6491590e7063cdf78d0a08..ce560fa5c04caa2a87a9573ca7c47d4c73a9c01f 100644
--- a/src/object.c
+++ b/src/object.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: object.c,v 1.35 1998/01/29 00:30:35 hubbe Exp $");
+RCSID("$Id: object.c,v 1.36 1998/01/29 22:53:55 hubbe Exp $");
 #include "object.h"
 #include "dynamic_buffer.h"
 #include "interpret.h"
@@ -363,6 +363,12 @@ void really_free_object(struct object *o)
     if(--o->refs > 0) return;
   }
 
+  if(o->parent)
+  {
+    free_object(o->parent);
+    o->parent=0;
+  }
+
   if(o->prev)
     o->prev->next=o->next;
   else
diff --git a/src/object.h b/src/object.h
index 650b1cf851f36b26d436c40931d8819a29915c7f..ad06e1a8af2c2d6557466fbc26d5b81421181de6 100644
--- a/src/object.h
+++ b/src/object.h
@@ -29,7 +29,7 @@ extern struct object *first_object;
 extern struct object *master_object;
 extern struct program *master_program;
 
-#define free_object(O) do{ struct object *o_=(O); if(!--o_->refs) really_free_object(o_); }while(0)
+#define free_object(O) do{ struct object *o_=(O); debug_malloc_touch(o_); if(!--o_->refs) really_free_object(o_); }while(0)
 
 #define LOW_GET_GLOBAL(O,I,ID) ((O)->storage+INHERIT_FROM_INT((O)->prog, (I))->storage_offset+(ID)->func.offset)
 #define GET_GLOBAL(O,I) LOW_GET_GLOBAL(O,I,ID_FROM_INT((O)->prog,I))
diff --git a/src/pike_memory.c b/src/pike_memory.c
index 416e4e011a06ece0fb3fc095a86a96808904ab14..ad3860956c95b5617292f83dac907fd98b1c9f0c 100644
--- a/src/pike_memory.c
+++ b/src/pike_memory.c
@@ -756,12 +756,19 @@ static void cleanup_memhdrs()
   mt_lock(&debug_malloc_mutex);
   if(verbose_debug_exit)
   {
+    int first=1;
     for(h=0;h<HSIZE;h++)
     {
       struct memhdr *m;
       for(m=hash[h];m;m=m->next)
       {
 	struct memloc *l;
+	if(first)
+	{
+	  fprintf(stderr,"\n");
+	  first=0;
+	}
+	
 	fprintf(stderr, "LEAK: (%p) %d bytes\n",m->data, m->size);
 	for(l=m->locations;l;l=l->next)
 	  fprintf(stderr,"  *** %s:%d (%d times) %s\n",
diff --git a/src/program.c b/src/program.c
index c2dfb0eab5913ac9f855122486166c9d9e50257d..0f13c71ef6d9d21b46330d8021f9438564540393 100644
--- a/src/program.c
+++ b/src/program.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: program.c,v 1.60 1998/01/29 17:43:22 hubbe Exp $");
+RCSID("$Id: program.c,v 1.61 1998/01/29 22:53:56 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -421,6 +421,7 @@ void low_start_new_program(struct program *p,
 #else
   fake_object=ALLOC_STRUCT(object);
 #endif
+  GC_ALLOC();
 
   fake_object->next=fake_object;
   fake_object->prev=fake_object;
@@ -579,6 +580,14 @@ void dump_program_desc(struct program *p)
 
 static void toss_compilation_resources(void)
 {
+  if(fake_object)
+  {
+    free_program(fake_object->prog);
+    fake_object->prog=0;
+    free_object(fake_object);
+    fake_object=0;
+  }
+
   free_program(new_program);
   new_program=0;
 
@@ -587,13 +596,6 @@ static void toss_compilation_resources(void)
       free((char *)malloc_size_program);
       malloc_size_program=0;
     }
-
-  if(fake_object)
-  {
-    fake_object->prog=0;
-    free_object(fake_object);
-    fake_object=0;
-  }
   
   while(compiler_frame)
     pop_compiler_frame();
diff --git a/src/program.h b/src/program.h
index 513c0b76ad2fc0fd0ecbe37b54346b44b464f4ba..76d244a39471ba37f7ea288f1b22217823e2f002 100644
--- a/src/program.h
+++ b/src/program.h
@@ -212,7 +212,7 @@ struct program
 
 #define FIND_LFUN(P,N) ((P)->flags & PROGRAM_FIXED?(P)->lfuns[(N)]:find_identifier(lfun_names[(N)],(P)))
 
-#define free_program(p) do{ struct program *_=(p); if(!--_->refs) really_free_program(_); }while(0)
+#define free_program(p) do{ struct program *_=(p); debug_malloc_touch(_); if(!--_->refs) really_free_program(_); }while(0)
 
 extern struct object *fake_object;
 extern struct program *new_program;