diff -ruN klic-3.003-2002-03-11/include/klic/g_basic.h klic-3.003-2002-03-11a/include/klic/g_basic.h
--- klic-3.003-2002-03-11/include/klic/g_basic.h	Tue Mar  5 22:07:53 2002
+++ klic-3.003-2002-03-11a/include/klic/g_basic.h	Mon Mar 11 15:14:00 2002
@@ -58,6 +58,7 @@
  */
 #define G_HEAPALLOC(from,size,type) \
 do{ \
+  set_heapp(g_allocp); \
   (from) = type(g_allocp); \
   g_allocp += (size); \
   assert(g_allocp >= heapp() + (size)); \
diff -ruN klic-3.003-2002-03-11/include/klic/gc_macro.h klic-3.003-2002-03-11a/include/klic/gc_macro.h
--- klic-3.003-2002-03-11/include/klic/gc_macro.h	Sat Mar  9 16:41:10 2002
+++ klic-3.003-2002-03-11a/include/klic/gc_macro.h	Mon Mar 11 15:00:07 2002
@@ -23,7 +23,7 @@
 extern void G_SUSPEND(q x, struct goalrec* goal);
 extern void G_MAKE_THE_NEW_GOAL(
   q* var, struct goalrec** goalp1, q(*myself)(),
-  unsigned long argc, q argv[], q* g_allocp );
+  unsigned long argc, q argv[] );
 
 #define GC_rappend(pref) G_rappend0(GC_CLASS_NAME(),pref)
 
@@ -155,7 +155,8 @@
 	if(isref(temp0) && (x) == derefone(temp0)) { \
           q var; \
           struct goalrec *goal; \
-	  G_MAKE_THE_NEW_GOAL(&var,&goal,g_myself,GC_ARGC,GC_ARGV,g_allocp); \
+          set_heapp(g_allocp); \
+	  G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GC_ARGC, GC_ARGV); \
           G_SUSPEND((x), goal); \
           g_allocp = heapp(); \
           GC_RETURN_FROM_NEW(var); \
@@ -180,7 +181,7 @@
   if(GC_GCREQUEST == res){ \
     q var; \
     struct goalrec *goal; \
-    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GC_ARGC, GC_ARGV, g_allocp); \
+    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GC_ARGC, GC_ARGV); \
     g_allocp = heapp(); \
     G_PUSH_GOAL_TO_SPECIAL_QUEUE(goal); \
     GC_RETURN_FROM_NEW(var); \
diff -ruN klic-3.003-2002-03-11/include/klic/gc_methtab.h klic-3.003-2002-03-11a/include/klic/gc_methtab.h
--- klic-3.003-2002-03-11/include/klic/gc_methtab.h	Sun Feb 24 14:51:10 2002
+++ klic-3.003-2002-03-11a/include/klic/gc_methtab.h	Mon Mar 11 14:02:55 2002
@@ -8,10 +8,6 @@
 #ifndef _KLIC_GC_METHTAB_H_
 #define _KLIC_GC_METHTAB_H_
 
-extern q* GC_STD_UNIFY();
-extern long GC_STD_PRINT();
-extern q* GC_STD_GC();
-
 /* runtime/generic.c */
 extern void GD_STD_DEALLOCATE(struct data_object* GD_SELF);
 extern q GD_STD_ENCODE(struct data_object* self, void* buffer);
@@ -22,19 +18,19 @@
 struct consumer_object_method_table GC_method_table
   = {
 #ifndef GCUSE_MY_UNIFY
-  GC_STD_UNIFY ,
+#error "please GCDEF_UNIFY and GCUSE_MY_UNIFY"
 #else
   GC_rappend(active_unify) ,
 #endif
 
 #ifndef GCUSE_MY_PRINT
- GC_STD_PRINT ,
+#error "please GCDEF_PRINT and GCUSE_MY_PRINT"
 #else
  GC_rappend(print) ,
 #endif
 
 #ifndef GCUSE_MY_GC
- GC_STD_GC ,
+#error "please GCDEF_GC and GCUSE_MY_GC"
 #else
  GC_rappend(gc) ,
 #endif
diff -ruN klic-3.003-2002-03-11/include/klic/gd_macro.h klic-3.003-2002-03-11a/include/klic/gd_macro.h
--- klic-3.003-2002-03-11/include/klic/gd_macro.h	Sat Mar  9 16:41:10 2002
+++ klic-3.003-2002-03-11a/include/klic/gd_macro.h	Mon Mar 11 14:59:39 2002
@@ -22,13 +22,13 @@
 
 /* runtime/generic.c */
 
-extern q* GD_MAKE_GENERIC_GOAL(
+extern void GD_MAKE_GENERIC_GOAL(
   struct goalrec** goalp1, q var,
-  unsigned long method_functor, q argv[], q* g_allocp );
+  unsigned long method_functor, q argv[] );
 
 extern void G_MAKE_THE_NEW_GOAL(
   q* var, struct goalrec** goalp1, q(*myself)(),
-  unsigned long argc, q argv[], q* g_allocp );
+  unsigned long argc, q argv[] );
 
 extern void G_SUSPEND(q x, struct goalrec* goal);
 
@@ -77,12 +77,9 @@
          (res==GENERIC_SUCCEEDED && g_allocp == heapp()+(size)) ); \
   if(GD_GCREQUEST == res){ \
     struct goalrec *goal; \
-    g_allocp = \
-      GD_MAKE_GENERIC_GOAL(&goal,makefunctor(GD_SELF),g_method_functor, \
-			   GD_ARGV,g_allocp); \
-    assert(g_allocp == heapp() + \
-      G_SIZE_IN_Q(struct functor) + arities(g_method_functor) - 1 + \
-      G_SIZE_IN_Q(struct goalrec) - 4 ); \
+    GD_MAKE_GENERIC_GOAL(&goal, makefunctor(GD_SELF), g_method_functor, \
+			   GD_ARGV); \
+    g_allocp = heapp(); \
     G_PUSH_GOAL(goal); \
     GD_RETURN; \
   } \
@@ -98,7 +95,7 @@
   if(GD_GCREQUEST == res){ \
     q var; \
     struct goalrec *goal; \
-    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GD_ARGC, GD_ARGV, g_allocp); \
+    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GD_ARGC, GD_ARGV); \
     g_allocp = heapp(); \
     G_PUSH_GOAL_TO_SPECIAL_QUEUE(goal); \
     assert(g_allocp == heapp()); \
@@ -118,7 +115,7 @@
   if(GENERIC_GCREQUEST == res){ \
     q var; \
     struct goalrec *goal; \
-    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GD_ARGC, GD_ARGV, g_allocp); \
+    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GD_ARGC, GD_ARGV); \
     g_allocp = heapp(); \
     G_PUSH_GOAL_TO_SPECIAL_QUEUE(goal); \
     assert(g_allocp == heapp()); \
@@ -137,9 +134,9 @@
          (res==GENERIC_SUCCEEDED && g_allocp == heapp()+GD_OBJ_SIZE(GD_SELF)) ); \
   if (GD_GCREQUEST == res) { \
     struct goalrec *goal; \
-    g_allocp = \
-      GD_MAKE_GENERIC_GOAL(&goal,makefunctor(GD_SELF), \
-			   g_method_functor,GD_ARGV, g_allocp); \
+    GD_MAKE_GENERIC_GOAL(&goal, makefunctor(GD_SELF), \
+			   g_method_functor, GD_ARGV ); \
+    g_allocp = heapp(); \
     G_PUSH_GOAL(goal); \
     GD_RETURN; \
   } \
@@ -185,10 +182,9 @@
 	q temp0 = derefone(x); \
 	if(isref(temp0) && (x) == derefone(temp0)) { \
           struct goalrec *goal; \
-          g_allocp = \
-	    GD_MAKE_GENERIC_GOAL(&goal,makefunctor(GD_SELF), \
-				 g_method_functor,GD_ARGV,g_allocp); \
           set_heapp(g_allocp); \
+	  GD_MAKE_GENERIC_GOAL(&goal, makefunctor(GD_SELF), \
+				 g_method_functor, GD_ARGV ); \
           G_SUSPEND((x), goal); \
           g_allocp = heapp(); \
           GD_RETURN; \
@@ -215,7 +211,8 @@
 	if(isref(temp0) && (x) == derefone(temp0)) { \
           q var; \
           struct goalrec *goal; \
-	  G_MAKE_THE_NEW_GOAL(&var,&goal,g_myself,GD_ARGC,GD_ARGV,g_allocp); \
+          set_heapp(g_allocp); \
+	  G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GD_ARGC, GD_ARGV); \
           G_SUSPEND((x), goal); \
           g_allocp = heapp(); \
           GD_SUSPEND_NEW(var); \
diff -ruN klic-3.003-2002-03-11/include/klic/gg_macro.h klic-3.003-2002-03-11a/include/klic/gg_macro.h
--- klic-3.003-2002-03-11/include/klic/gg_macro.h	Mon Mar 11 13:23:18 2002
+++ klic-3.003-2002-03-11a/include/klic/gg_macro.h	Mon Mar 11 15:01:28 2002
@@ -21,7 +21,7 @@
 
 extern void G_MAKE_THE_NEW_GOAL(
   q* var, struct goalrec** goalp1, q(*myself)(),
-  unsigned long argc, q argv[], q* g_allocp );
+  unsigned long argc, q argv[] );
 
 extern void G_SUSPEND(q x, struct goalrec* goal);
 extern q GG_MAKE_HOOK_VAR(struct generator_object* obj);
@@ -135,7 +135,8 @@
 	if(isref(temp0) && (x) == derefone(temp0)) { \
           q var; \
           struct goalrec *goal; \
-	  G_MAKE_THE_NEW_GOAL(&var,&goal,g_myself,GG_ARGC,GG_ARGV,g_allocp); \
+          set_heapp(g_allocp); \
+	  G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GG_ARGC, GG_ARGV); \
           G_SUSPEND((x), goal); \
           g_allocp = heapp(); \
           GG_RETURN_FROM_NEW(var); \
@@ -159,7 +160,7 @@
   if(GG_GCREQUEST == res) { \
     q var; \
     struct goalrec *goal; \
-    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GG_ARGC, GG_ARGV, g_allocp); \
+    G_MAKE_THE_NEW_GOAL(&var, &goal, g_myself, GG_ARGC, GG_ARGV); \
     g_allocp = heapp(); \
     G_PUSH_GOAL_TO_SPECIAL_QUEUE(goal); \
     GG_RETURN_FROM_NEW(var); \
diff -ruN klic-3.003-2002-03-11/include/klic/gg_methtab.h klic-3.003-2002-03-11a/include/klic/gg_methtab.h
--- klic-3.003-2002-03-11/include/klic/gg_methtab.h	Mon Mar 11 13:32:23 2002
+++ klic-3.003-2002-03-11a/include/klic/gg_methtab.h	Mon Mar 11 13:59:03 2002
@@ -27,7 +27,6 @@
 
 #ifndef GGUSE_MY_GENERATE
 #error "please GGDEF_GENERATE and GGUSE_MY_GENERATE"
-  GG_STD_GENERATE ,
 #else
   GG_rappend(generate) ,
 #endif
diff -ruN klic-3.003-2002-03-11/runtime/generic.c klic-3.003-2002-03-11a/runtime/generic.c
--- klic-3.003-2002-03-11/runtime/generic.c	Sat Mar  9 16:41:10 2002
+++ klic-3.003-2002-03-11a/runtime/generic.c	Mon Mar 11 15:14:03 2002
@@ -35,21 +35,21 @@
   suspend_goal(goal, x);
 }
 
-extern q*
-GD_MAKE_GENERIC_GOAL(goalp1, var, method_functor, argv, g_allocp)
+extern void
+GD_MAKE_GENERIC_GOAL(goalp1, var, method_functor, argv)
   struct goalrec** goalp1;
   q var;
   unsigned long method_functor;
   q argv[];
-  q* g_allocp;
 {
   G_STD_DECL;
   unsigned long argc = arities (method_functor);
+  q* g_allocp = heapp();
   q objp;
   int i;
 
   G_HEAPALLOC(objp, G_SIZE_IN_Q(struct functor)+argc-1, makefunctor);
-  assert(g_allocp >= heapp() + G_SIZE_IN_Q(struct functor)+argc-1);
+  assert(g_allocp == heapp() + G_SIZE_IN_Q(struct functor)+argc-1);
   functor_of(objp) = makesym(method_functor);
   for( i=0; i<argc; i++ ){
     arg(objp, i) = argv[i];
@@ -60,23 +60,22 @@
   (*goalp1)->pred    = GD_GENERIC_GOAL;
   (*goalp1)->args[0] = objp;
   (*goalp1)->args[1] = var;
-  return g_allocp;
+  set_heapp(g_allocp);
 }
 
 extern void
-G_MAKE_THE_NEW_GOAL(var, goalp1, myself, argc, argv, g_allocp)
+G_MAKE_THE_NEW_GOAL(var, goalp1, myself, argc, argv)
   q* var;
   struct goalrec** goalp1;
   q (*myself)();
   unsigned long argc;
   q argv[];
-  q* g_allocp;
 {
   G_STD_DECL;
   q newvar;
   q newobj, newobj2;
+  q* g_allocp;
 
-  set_heapp(g_allocp);
   newobj = gd_new_pointer(myself);
   newobj2 = gd_new_termarray(argc, argv);
   g_allocp = heapp();
@@ -100,9 +99,8 @@
     q temp0 = derefone(obj); \
     if( isref(temp0) && (obj) == derefone(temp0) ){ \
       struct goalrec* goal; \
-      g_allocp = \
-        GD_MAKE_GENERIC_GOAL(&goal,(obj),g_method_functor,g_argv,g_allocp); \
       set_heapp(g_allocp); \
+      GD_MAKE_GENERIC_GOAL(&goal, (obj), g_method_functor, g_argv); \
       G_SUSPEND((obj), goal); \
       g_allocp = heapp(); \
       GD_RETURN; \
