diff -ruN klic-3.003-2002-03-05/runtime/gc.c klic-3.003-2002-03-05a/runtime/gc.c
--- klic-3.003-2002-03-05/runtime/gc.c	Tue Mar  5 12:21:20 2002
+++ klic-3.003-2002-03-05a/runtime/gc.c	Tue Mar  5 14:30:00 2002
@@ -103,17 +103,16 @@
   return (unsigned long)x - (unsigned long)old_space_top() < old_space_size();
 }
 
-#define push_gc_stack(addr, sp, max)			\
+#define push_gc_stack(addr, sp)			\
 do{							\
-  if( (sp) == max ){					\
+  if( (sp) == gcmax() ){					\
     (sp) = make_larger_stack(sp);			\
-    max = gcmax();					\
   }							\
   *(sp)++ = (addr);					\
 }while(0)
 
 #ifdef SHM
-#define reserve_copy(from, to, sp, max) \
+#define reserve_copy(from, to, sp) \
 if( from == makeref(&from) ){ \
   to = from = makeref(&to); \
 }else{ \
@@ -123,24 +122,24 @@
       push_shm_stack(&to); \
     }else if( within_old_space(from) ){ \
       from = makeref(&to); \
-      push_gc_stack(&to, sp, max); \
+      push_gc_stack(&to, sp); \
     } \
   } \
 }
 #else /* not SHM */
-#define reserve_copy(from, to, sp, max)	\
+#define reserve_copy(from, to, sp)	\
 if( from == makeref(&from) ){ \
   to = from = makeref(&to); \
 }else{ \
   to = from; \
   if( !isatomic(from) && within_old_space(from) ){ \
     from = makeref(&to); \
-    push_gc_stack(&to, sp, max); \
+    push_gc_stack(&to, sp); \
   } \
 }
 #endif /* not SHM */
 
-#define copy_one_goal(goal, sp, max, susp)		\
+#define copy_one_goal(goal, sp, susp)		\
 do{							\
   struct goalrec* og = (goal);				\
   int n = og->pred->arity;				\
@@ -151,7 +150,7 @@
   ng->pred = og->pred;					\
   og->pred = 0;						\
   while( --n >= 0 ){					\
-    reserve_copy(og->args[n], ng->args[n], (sp), (max)); \
+    reserve_copy(og->args[n], ng->args[n], (sp)); \
   }							\
   (goal) = ng;						\
   if( susp ) copied_susp++;				\
@@ -163,7 +162,6 @@
   declare_globals;
   q* hp = heapp();
   q** sp = gcsp();
-  q** max = gcmax();
   while( sp > gcstack ){
     q* addr;
     q obj;
@@ -188,205 +186,198 @@
       *addr = obj;
       break;
 
+    case CONS:
+    cons_case:
+      if( !within_old_space(obj) ){
+	*addr = obj;
+      }else{
+	q cdr = cdr_of(obj);
+	if( isstruct(cdr) && within_new_space(cdr) ){
+	  *addr = cdr;
+	}else{
+	  q newcons = makecons(hp);
+	  hp += 2;
+	  reserve_copy(car_of(obj), car_of(newcons), sp);
+	  *addr = cdr_of(obj) = newcons;
+	  if( isatomic(cdr) ){
+	    cdr_of(newcons) = cdr;
+	  }else if( cdr == makeref(&cdr_of(obj)) ){
+	    cdr_of(newcons) = makeref(&cdr_of(newcons));
+	  }else{
+	    addr = &cdr_of(newcons);
+	    obj = cdr;
+	    goto loop;
+	  }
+	}
+      }
+      break;
+
+    case FUNCTOR:
+    functor_case:
+      if( !within_old_space(obj) ){
+	*addr = obj;
+      }else{
+	q f = functor_of(obj);
+	if( isstruct(f) ){
+	  *addr = f;
+	}else if( isref(f) ){
+	  struct data_object* oldobj = (struct data_object*) functorp(obj);
+	  q* newobj;
+	  newobj = generic_gc(oldobj, hp, sp);
+	  sp = gcsp0;
+	  hp = heapp();
+	  *addr = functor_of(obj) = makefunctor(newobj);
+	}else{
+	  q newfunct = makefunctor(hp);
+	  int k = arityof(f);
+	  hp += k+1;
+	  *addr = functor_of(obj) = newfunct;
+	  functor_of(newfunct) = f;
+	  do{
+	    k--;
+	    reserve_copy(arg(obj,k), arg(newfunct,k), sp);
+	  }while( k > 0 );
+	}
+      }
+      break;
+
     case VARREF:
       {
 	q value;
       deref:
 	value = derefone(obj);
 	switch( ptagof(value) ){
+	case ATOMIC:
+	  *addr = value;
+	  break;
+	case FUNCTOR:
+	  obj = value;
+	  goto functor_case;
+	case CONS:
+	  if( !within_new_space(value) ){
+	    obj = value;
+	    goto cons_case;
+	  }
+	  *addr = makeref(&cdr_of(value));
+	  break;
 	case VARREF:
-	  if( derefone(value) == obj ){
-	    if( value == obj ){
-	      if( within_new_space(addr) ){
-		*addr = derefone(obj) = makeref(addr);
+	  if( derefone(value) != obj ){
+	    if( within_old_space(value) ){
+	      obj = value;
+	      goto deref;
+	    }
+	    *addr = value;
+#ifdef SHM
+	    if( is_shma(value) ) push_shm_stack(addr);
+#endif
+	  }else if( value == obj ){
+	    if( within_new_space(addr) ){
+	      *addr = derefone(obj) = makeref(addr);
+	    }else{
+	      *addr = derefone(obj) = *hp = makeref(hp);
+	      hp++;
+	    }
+	  }else{
+	    struct susprec* s = suspp(value);
+	    if( is_generator_susp(s->u) ){
+	      struct generator_object* oldobj;
+	      struct generator_susp* newgsusp;
+	      struct generator_susp* gsusp = generator_suspp(s);
+	      q newplace;
+	      q newvar = *addr = derefone(obj) = makeref(hp);
+
+	      hp++;
+	      newgsusp = generator_suspp(hp);
+	      hp += sizeof(struct generator_susp) / sizeof(q);
+	      derefone(newvar) = makeref(newgsusp);
+	      newgsusp->backpt = makeref(newvar);
+	      oldobj = untag_generator_susp(gsusp->u.o);
+	      newplace = (q) (oldobj->method_table);
+	      if( isstruct(newplace) ){
+		/* already copied */
+		newgsusp->u.o = tag_generator_susp(functorp(newplace));
 	      }else{
-		*addr = derefone(obj) = *hp = makeref(hp);
-		hp++;
+		/* not yet copied */
+		struct generator_object* newobj =
+		  (struct generator_object*) generic_gc(oldobj, hp, sp);
+		sp = gcsp0;
+		hp = heapp();
+		oldobj->method_table =
+		  (struct generator_object_method_table*) makefunctor(newobj);
+		newgsusp->u.o = tag_generator_susp(newobj);
 	      }
 	    }else{
-	      struct susprec* s = suspp(value);
-	      if( is_generator_susp(s->u) ){
-		struct generator_object* oldobj;
-		struct generator_susp* newgsusp;
-		struct generator_susp* gsusp = generator_suspp(s);
-		q newplace;
-		q newvar = *addr = derefone(obj) = makeref(hp);
-
-		hp++;
-		newgsusp = generator_suspp(hp);
-		hp += sizeof(struct generator_susp) / sizeof(q);
-		derefone(newvar) = makeref(newgsusp);
-		newgsusp->backpt = makeref(newvar);
-		oldobj = untag_generator_susp(gsusp->u.o);
-		newplace = (q) (oldobj->method_table);
-		if( isstruct(newplace) ){
-		  /* already copied */
-		  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;
-		  hp = heapp();
-		  oldobj->method_table =
-		    (struct generator_object_method_table*) makefunctor(newobj);
-		  newgsusp->u.o = tag_generator_susp(newobj);
-		}
-	      }else{
-		struct hook* second_hook = s->u.first_hook.next;
-		struct hook* h = second_hook;
-		struct hook dummy;
-		struct hook* last = &dummy;
-		union goal_or_consumer lastu;
-		q newvar;
-
-		/* make a new variable, anyway */
-		newvar = *addr = derefone(obj) = *hp = makeref(hp);
-		hp++;
-		lastu.l = 0;
-		do{
-		  union goal_or_consumer u = h->u;
-		  if( u.l != 0 ){
-		    union goal_or_consumer nu;
-		    nu.l = 0;
-		    if( !is_consumer_hook(u) ){
-		      /* suspended goal */
-		      if( u.g->pred == 0 ){
-			nu.g = u.g->next;
-		      }else if( !isref(u.g->next) ){
-			nu.g = u.g;
-			copy_one_goal(nu.g, sp, max, 1);
-		      }else{
-			goto invalid_hook;
-		      }
+	      struct hook* second_hook = s->u.first_hook.next;
+	      struct hook* h = second_hook;
+	      struct hook dummy;
+	      struct hook* last = &dummy;
+	      union goal_or_consumer lastu;
+	      q newvar;
+
+	      /* make a new variable, anyway */
+	      newvar = *addr = derefone(obj) = *hp = makeref(hp);
+	      hp++;
+	      lastu.l = 0;
+	      do{
+		union goal_or_consumer u = h->u;
+		if( u.l != 0 ){
+		  union goal_or_consumer nu;
+		  nu.l = 0;
+		  if( !is_consumer_hook(u) ){
+		    /* suspended goal */
+		    if( u.g->pred == 0 ){
+		      nu.g = u.g->next;
 		    }else{
-		      /* consumer object */
-		      q newplace = (q) (untag_consumer_hook(u.o)->method_table);
-		      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;
-			hp = heapp();
-			untag_consumer_hook(u.o)->method_table =
-			  (struct consumer_object_method_table*)
-			    makefunctor(newobj);
-			nu.o = tag_consumer_hook(newobj);
-		      }
+		      if(isref(u.g->next)) goto invalid_hook;
+		      nu.g = u.g;
+		      copy_one_goal(nu.g, sp, 1);
 		    }
-		    if( lastu.l != 0 ){
-		      struct hook* nh = (struct hook*) hp;
-		      hp += sizeof(struct hook)/sizeof(q);
-		      nh->u = lastu;
-		      last->next = nh;
-		      last = nh;
+		  }else{
+		    /* consumer object */
+		    q newplace = (q) (untag_consumer_hook(u.o)->method_table);
+		    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;
+		      hp = heapp();
+		      untag_consumer_hook(u.o)->method_table =
+			(struct consumer_object_method_table*)
+			  makefunctor(newobj);
+		      nu.o = tag_consumer_hook(newobj);
 		    }
-		    lastu = nu;
 		  }
-		invalid_hook:
-		  h = h->next;
-		}while( h != second_hook );
-		if( lastu.l != 0 ){
-		  struct susprec* ns = (struct susprec*) hp;
-		  hp += sizeof(struct susprec)/sizeof(q);
-		  last->next = &ns->u.first_hook;
-		  ns->backpt = newvar;
-		  ns->u.first_hook.next = dummy.next;
-		  ns->u.first_hook.u = lastu;
-		  derefone(newvar) = (q) ns;
+		  if( lastu.l != 0 ){
+		    struct hook* nh = (struct hook*) hp;
+		    hp += sizeof(struct hook)/sizeof(q);
+		    nh->u = lastu;
+		    last->next = nh;
+		    last = nh;
+		  }
+		  lastu = nu;
 		}
+	      invalid_hook:
+		h = h->next;
+	      }while( h != second_hook );
+	      if( lastu.l != 0 ){
+		struct susprec* ns = (struct susprec*) hp;
+		hp += sizeof(struct susprec)/sizeof(q);
+		last->next = &ns->u.first_hook;
+		ns->backpt = newvar;
+		ns->u.first_hook.next = dummy.next;
+		ns->u.first_hook.u = lastu;
+		derefone(newvar) = (q) ns;
 	      }
 	    }
-	  }else if( within_old_space(value) ){
-	    obj = value;
-	    goto deref;
-	  }else{
-	    *addr = value;
-#ifdef SHM
-	    if( is_shma(value) ) push_shm_stack(addr);
-#endif
 	  }
 	  break;
-	case CONS:
-	  if( within_new_space(value) ){
-	    *addr = makeref(&cdr_of(value));
-	  }else{
-	    obj = value;
-	    goto cons_case;
-	  }
-	  break;
-	case ATOMIC:
-	  *addr = value;
-	  break;
-	default: /* FUNCTOR */
-	  obj = value;
-	  goto functor_case;
-	}
+	}  /* switch ptagof(value) */
       }
       break;
-
-    case CONS:
-    cons_case:
-      if( within_old_space(obj) ){
-	q cdr = cdr_of(obj);
-	if( !isstruct(cdr) || !within_new_space(cdr) ){
-	  q newcons = makecons(hp);
-	  hp += 2;
-	  reserve_copy(car_of(obj), car_of(newcons), sp, max);
-	  *addr = cdr_of(obj) = newcons;
-	  if( isatomic(cdr) ){
-	    cdr_of(newcons) = cdr;
-	  }else{
-	    if( cdr == makeref(&cdr_of(obj)) ){
-	      cdr_of(newcons) = makeref(&cdr_of(newcons));
-	    }else{
-	      addr = &cdr_of(newcons);
-	      obj = cdr;
-	      goto loop;
-	    }
-	  }
-	}else{
-	  *addr = cdr;
-	}
-      }else{
-	*addr = obj;
-      }
-      break;
-
-    default: /* FUNCTOR */
-    functor_case:
-      if( within_old_space(obj) ){
-	q f = functor_of(obj);
-	if( !isstruct(f) ){
-	  if( isref(f) ){
-	    struct data_object* oldobj = (struct data_object*) functorp(obj);
-	    q* newobj;
-	    newobj = generic_gc(oldobj, hp, sp);
-	    sp = gcsp0;
-	    hp = heapp();
-	    *addr = functor_of(obj) = makefunctor(newobj);
-	  }else{
-	    q newfunct = makefunctor(hp);
-	    int k = arityof(f);
-	    hp += k+1;
-	    *addr = functor_of(obj) = newfunct;
-	    functor_of(newfunct) = f;
-	    do{
-	      k--;
-	      reserve_copy(arg(obj,k), arg(newfunct,k), sp, max);
-	    }while( k > 0 );
-	  }
-	}else{
-	  *addr = f;
-	}
-      }else{
-	*addr = obj;
-      }
-      break;
-    }
-  }
+    }  /* switch ptagof(obj) */
+  }  /* while stack rests */
   set_gcsp(sp);
   set_heapp(hp);
 }
@@ -423,7 +414,7 @@
     }
 #endif
     hp = heapp();
-    copy_one_goal(qp, gcsp0, gcmax0, 0);
+    copy_one_goal(qp, gcsp0, 0);
     set_heapp(hp);
     copy_terms();
     qp->next = last;
@@ -527,7 +518,7 @@
       switch( ptagof(sptr->localA) ){
       case CONS:
       case FUNCTOR:  /* generator hook but anybody reqested */
-        push_gc_stack((q*) &sptr->localA, gcsp0, gcmax0);
+        push_gc_stack((q*) &sptr->localA, gcsp0);
 	copy_terms();
         push_shm_stack(&sptr->globalA);
         break;
@@ -541,7 +532,7 @@
 	    q top = (q) &(sptr->localA);
 	    derefone(wk) = top;
 	    derefone(top) = wk;
-	    push_gc_stack(&top, gcsp0, gcmax0);
+	    push_gc_stack(&top, gcsp0);
 
 	    /* patch for debugging of hirata problem */
 	    hirata_bug1 = 1;
@@ -554,7 +545,7 @@
 	    sptr->localA = (q*) tag_local(wk);
 	    derefone(wk) = 0;
 	  }else{ /* generator */
-	    push_gc_stack(&wk, gcsp0, gcmax0);
+	    push_gc_stack(&wk, gcsp0);
 	    copy_terms();
 	    sptr->localA = (q*) tag_local(wk);
 	  }
@@ -568,7 +559,7 @@
 	  }else if( !wqp->pred ){
 	    sptr->localA = (q*) wqp->next;
 	  }else if( isint(wqp->next) ){
-	    copy_one_goal(wqp, gcsp0, gcmax0, 1);
+	    copy_one_goal(wqp, gcsp0, 1);
 	    sptr->localA = (q*) wqp;
 	    copy_terms();
 	    if( isref(sptr->globalA) ){
@@ -651,7 +642,7 @@
 	sgl->goal = sgl->goal->next;
       }else{
 	/* not copied yet */
-	copy_one_goal(sgl->goal, gcsp0, gcmax0, 0);
+	copy_one_goal(sgl->goal, gcsp0, 0);
 	set_heapp(hp);
 	copy_terms();
 	hp = heapp();
@@ -688,7 +679,7 @@
   q* term;
 {
   declare_globals;
-  push_gc_stack(term, gcsp0, gcmax0);
+  push_gc_stack(term, gcsp0);
   copy_terms();
 }
 
@@ -701,7 +692,7 @@
 {
   declare_globals;
 
-  push_gc_stack(term, gcsp0, gcmax0);
+  push_gc_stack(term, gcsp0);
   copy_terms();
   return *term;
 }
