diff -ruN klic-3.003-2002-03-05a/include/klic/g_basic.h klic-3.003-2002-03-05b/include/klic/g_basic.h
--- klic-3.003-2002-03-05a/include/klic/g_basic.h	Mon Feb 25 15:03:42 2002
+++ klic-3.003-2002-03-05b/include/klic/g_basic.h	Tue Mar  5 15:10:35 2002
@@ -111,18 +111,19 @@
  */
 #define G_COPY_KL1_TERM_TO_NEWGEN(from,to) \
 do{ \
-  if (g_sp == gcmax()) { \
-    (g_sp) = make_larger_stack(g_sp); \
+  if (gcsp() == gcmax()) { \
+    set_gcsp(make_larger_stack(gcsp())); \
   } \
   if(isref(from)) { \
     q *newword = g_allocp++; \
     derefone(newword) = (from); \
     (to) = makeref(newword); \
-    *(g_sp++) = newword; \
+    *gcsp() = newword; \
   } else { \
     (to) = (from); \
-    *(g_sp++) = &(to); \
+    *gcsp() = &(to); \
   } \
+  set_gcsp(gcsp() + 1); \
   assert(g_allocp >= heapp()); \
 }while(0)
 
diff -ruN klic-3.003-2002-03-05a/include/klic/g_methtab.h klic-3.003-2002-03-05b/include/klic/g_methtab.h
--- klic-3.003-2002-03-05a/include/klic/g_methtab.h	Sun Feb 24 14:52:25 2002
+++ klic-3.003-2002-03-05b/include/klic/g_methtab.h	Tue Mar  5 15:02:42 2002
@@ -30,7 +30,7 @@
 		    FILE *out_stream,
 		    unsigned long depth,
 		    unsigned long length */ );
-  q *(*gc)( /* struct data_object *obj, q *allocp , q **sp */ );
+  q* (*gc)( /* struct data_object* obj, q* allocp */ );
   void (*deallocate)( /* struct data_object* obj */ );
   q *(*body_generic)( /* struct data_object *obj,
 				      q method_functor,
@@ -66,7 +66,7 @@
 		  FILE *out_stream,
 		  unsigned long max_depth,
 		  unsigned long max_length */);
-  q *(*gc)(/* struct consumer_object *obj, q *allocp, q **sp */);
+  q* (*gc)(/* struct consumer_object* obj, q* allocp */);
   void (*deallocate)( /* struct consumer_object* obj */ );
   q (*encode)(/* struct consumer_object *obj, long node */);
 };
@@ -90,9 +90,7 @@
 		  FILE* out_stream,
 		  unsigned long max_depth,
 		  unsigned long max_length */);
-  q* (*gc)( /* struct generator_object* self,
-	       q* allocp,
-	       q** sp */);
+  q* (*gc)(/* struct generator_object* self, q* allocp */);
   void (*deallocate)(/* struct generator_object* self */);
   q (*encode)(/* struct generator_object* self, long node */);
 };
diff -ruN klic-3.003-2002-03-05a/include/klic/gc_macro.h klic-3.003-2002-03-05b/include/klic/gc_macro.h
--- klic-3.003-2002-03-05a/include/klic/gc_macro.h	Mon Feb 25 18:09:34 2002
+++ klic-3.003-2002-03-05b/include/klic/gc_macro.h	Tue Mar  5 14:59:48 2002
@@ -223,10 +223,9 @@
 #define GCDEF_GC() \
  static \
   q * \
-  GC_rappend(gc) (GC_SELF,g_allocp,g_sp) \
+GC_rappend(gc) (GC_SELF, g_allocp) \
     GC_OBJ_TYPE *GC_SELF; \
-    q *g_allocp; \
-    q **g_sp;
+    q* g_allocp;
 
 #define GCSET_NEWOBJ_IN_NEWGEN(newobj) \
 do{ \
@@ -240,7 +239,6 @@
 #define GC_RETURN_FROM_GC(newgobj) \
 do{ \
   assert(g_allocp == heapp()); \
-  set_gcsp(g_sp); \
   return (q *) (newgobj); \
 }while(0)
 
diff -ruN klic-3.003-2002-03-05a/include/klic/gd_macro.h klic-3.003-2002-03-05b/include/klic/gd_macro.h
--- klic-3.003-2002-03-05a/include/klic/gd_macro.h	Mon Feb 25 14:58:18 2002
+++ klic-3.003-2002-03-05b/include/klic/gd_macro.h	Tue Mar  5 14:59:08 2002
@@ -372,14 +372,12 @@
 
 #define GDDEF_GC() \
  static q * \
-  GD_rappend(gc) (GD_SELF,g_allocp,g_sp) \
+GD_rappend(gc) (GD_SELF, g_allocp) \
     GD_OBJ_TYPE * GD_SELF; \
-    q *g_allocp; \
-    q **g_sp;
+    q* g_allocp;
 
 #define GD_RETURN_FROM_GC(newgobj) \
 do{ \
-  set_gcsp(g_sp); \
   assert(g_allocp == heapp()); \
   return(((q *)(newgobj))); \
 }while(0)
diff -ruN klic-3.003-2002-03-05a/include/klic/gg_macro.h klic-3.003-2002-03-05b/include/klic/gg_macro.h
--- klic-3.003-2002-03-05a/include/klic/gg_macro.h	Mon Feb 25 14:58:32 2002
+++ klic-3.003-2002-03-05b/include/klic/gg_macro.h	Tue Mar  5 14:58:02 2002
@@ -210,10 +210,9 @@
 
 #define GGDEF_GC() \
 static \
-q * GG_rappend(gc) (GG_SELF, g_allocp, g_sp) \
+q* GG_rappend(gc) (GG_SELF, g_allocp) \
   GG_OBJ_TYPE *GG_SELF; \
-  q *g_allocp; \
-  q **g_sp;
+  q* g_allocp;
 
 #define GGSET_NEWOBJ_IN_NEWGEN(newobj) \
 do{ \
@@ -226,7 +225,6 @@
 
 #define GG_RETURN_FROM_GC(newgobj) \
 do{ \
-  set_gcsp(g_sp); \
   assert(g_allocp == heapp()); \
   return(((q *)(newgobj))); \
 }while(0)
diff -ruN klic-3.003-2002-03-05a/runtime/gc.c klic-3.003-2002-03-05b/runtime/gc.c
--- klic-3.003-2002-03-05a/runtime/gc.c	Tue Mar  5 14:30:00 2002
+++ klic-3.003-2002-03-05b/runtime/gc.c	Tue Mar  5 15:07:00 2002
@@ -23,8 +23,7 @@
 #include "shm.h"
 #endif  /* SHM */
 
-#define generic_gc(obj, allocp, sp) \
-  (method_table_of(obj)->gc((obj), (allocp), (sp)))
+#define generic_gc(obj, allocp)  (method_table_of(obj)->gc((obj), (allocp)))
 
 extern const struct predicate queue_empty_pred;
 
@@ -223,8 +222,9 @@
 	}else if( isref(f) ){
 	  struct data_object* oldobj = (struct data_object*) functorp(obj);
 	  q* newobj;
-	  newobj = generic_gc(oldobj, hp, sp);
-	  sp = gcsp0;
+	  set_gcsp(sp);
+	  newobj = generic_gc(oldobj, hp);
+	  sp = gcsp();
 	  hp = heapp();
 	  *addr = functor_of(obj) = makefunctor(newobj);
 	}else{
@@ -298,9 +298,10 @@
 		newgsusp->u.o = tag_generator_susp(functorp(newplace));
 	      }else{
 		/* not yet copied */
-		struct generator_object* newobj =
-		  (struct generator_object*) generic_gc(oldobj, hp, sp);
-		sp = gcsp0;
+		struct generator_object* newobj;
+		set_gcsp(sp);
+		newobj = (struct generator_object*) generic_gc(oldobj, hp);
+		sp = gcsp();
 		hp = heapp();
 		oldobj->method_table =
 		  (struct generator_object_method_table*) makefunctor(newobj);
@@ -338,10 +339,11 @@
 		    if( isstruct(newplace) ){
 		      nu.o = tag_consumer_hook(functorp(newplace));
 		    }else{
-		      struct consumer_object* newobj =
-			(struct consumer_object*)
-			  generic_gc(untag_consumer_hook(u.o), hp, sp);
-		      sp = gcsp0;
+		      struct consumer_object* newobj;
+		      set_gcsp(sp);
+		      newobj = (struct consumer_object*)
+			  generic_gc(untag_consumer_hook(u.o), hp);
+		      sp = gcsp();
 		      hp = heapp();
 		      untag_consumer_hook(u.o)->method_table =
 			(struct consumer_object_method_table*)
diff -ruN klic-3.003-2002-03-05a/runtime/generic.c klic-3.003-2002-03-05b/runtime/generic.c
--- klic-3.003-2002-03-05a/runtime/generic.c	Mon Feb 25 15:00:39 2002
+++ klic-3.003-2002-03-05b/runtime/generic.c	Tue Mar  5 15:03:40 2002
@@ -181,13 +181,10 @@
 }
 
 extern q*
-GD_STD_GC(GD_SELF, g_allocp, g_sp)
+GD_STD_GC(GD_SELF, g_allocp)
   struct data_object* GD_SELF;
   q* g_allocp;
-  q** g_sp;
 {
-  declare_globals;
-  set_gcsp(g_sp);
   return g_allocp;
 }
 
diff -ruN klic-3.003-2002-03-05a/runtime/gmvv.c klic-3.003-2002-03-05b/runtime/gmvv.c
--- klic-3.003-2002-03-05a/runtime/gmvv.c	Mon Feb 25 15:07:19 2002
+++ klic-3.003-2002-03-05b/runtime/gmvv.c	Tue Mar  5 15:05:19 2002
@@ -170,10 +170,11 @@
      * GD_COPY_KL1_TERM_TO_NEWGEN(GD_SELF->body, newself->body);
      */
     newself->body = GD_SELF->body;
-    if (g_sp == gcmax()) {
-      (g_sp) = make_larger_stack(g_sp);
+    if (gcsp() == gcmax()) {
+      set_gcsp(make_larger_stack(gcsp()));
     }
-    *(g_sp++) = (q *)&(newself->body);
+    *gcsp() = (q*) &(newself->body);
+    set_gcsp(gcsp() + 1);
     /* End of manual expansion */
   }
   set_heapp(g_allocp);
diff -ruN klic-3.003-2002-03-05a/runtime/random.c klic-3.003-2002-03-05b/runtime/random.c
--- klic-3.003-2002-03-05a/runtime/random.c	Mon Feb 25 15:01:07 2002
+++ klic-3.003-2002-03-05b/runtime/random.c	Tue Mar  5 15:05:34 2002
@@ -78,7 +78,6 @@
 
   BCOPY(GG_SELF, g_allocp, sizeof(GG_OBJ_TYPE));
   g_allocp += sizeof(GG_OBJ_TYPE)/sizeof(q);
-  set_gcsp(g_sp);
   set_heapp(g_allocp);
   return newself;
 }
