diff --git a/src/svalue.c b/src/svalue.c
index 1d81a36b878a71c58d781f87fbec51104c69772a..09757a21f6f78288e774910e03b407909a95204c 100644
--- a/src/svalue.c
+++ b/src/svalue.c
@@ -23,7 +23,7 @@
 #include "queue.h"
 #include "bignum.h"
 
-RCSID("$Id: svalue.c,v 1.69 2000/04/17 21:06:24 hubbe Exp $");
+RCSID("$Id: svalue.c,v 1.70 2000/04/17 23:07:34 grubba Exp $");
 
 struct svalue dest_ob_zero = { T_INT, 0 };
 
@@ -1413,32 +1413,46 @@ void debug_gc_mark_short_svalue(union anything *u, TYPE_T type)
   {
 #ifdef PIKE_DEBUG
     case T_STRING:
-      if(d_flag) gc_mark(u->string);
+      if(d_flag) gc_mark(debug_malloc_pass(u->string));
       break;
 #endif
 
   case T_ARRAY: 
     if(!u->refs) return;
-    gc_mark_array_as_referenced(u->array);
+    enqueue(&gc_mark_queue,
+	    (queue_call)gc_mark_array_as_referenced,
+	    debug_malloc_pass(u->array));
     break;
   case T_MULTISET:
     if(!u->refs) return;
-    gc_mark_multiset_as_referenced(u->multiset);
+    enqueue(&gc_mark_queue,
+	    (queue_call)gc_mark_multiset_as_referenced,
+	    debug_malloc_pass(u->multiset));
     break;
   case T_MAPPING:
     if(!u->refs) return;
-    gc_mark_mapping_as_referenced(u->mapping);
+    enqueue(&gc_mark_queue,
+	    (queue_call)gc_mark_mapping_as_referenced,
+	    debug_malloc_pass(u->mapping));
     break;
   case T_PROGRAM:
     if(!u->refs) return;
-    gc_mark_program_as_referenced(u->program);
+    enqueue(&gc_mark_queue,
+	    (queue_call)gc_mark_program_as_referenced,
+	    debug_malloc_pass(u->program));
     break;
 
+#ifdef PIKE_DEBUG
+  case T_FUNCTION:
+    fatal("gc_mark_short_svalue(%p, PIKE_T_FUNCTION).\n", u->refs);
+#endif /* PIKE_DEBUG */
   case T_OBJECT:
     if(!u->refs) return;
     if(u->object->prog)
     {
-      gc_mark_object_as_referenced(u->object);
+      enqueue(&gc_mark_queue,
+	      (queue_call)gc_mark_object_as_referenced,
+	      debug_malloc_pass(u->object));
     }
 #ifdef PIKE_DEBUG
     else