diff --git a/src/program.c b/src/program.c
index b5921c041d02238905d3838e53a05dca1b9f2893..ef1c15be0585a40b48cd5581fbc0a77ae78618a9 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.67 1998/03/26 14:30:58 grubba Exp $");
+RCSID("$Id: program.c,v 1.68 1998/04/06 04:31:32 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -891,6 +891,14 @@ void set_gc_mark_callback(void (*m)(struct object *))
   new_program->gc_marked=m;
 }
 
+/*
+ * Called for all objects and inherits in first pass of gc()
+ */
+void set_gc_check_callback(void (*m)(struct object *))
+{
+  new_program->gc_check=m;
+}
+
 int low_reference_inherited_identifier(struct program_state *q,
 				       int e,
 				       struct pike_string *name)
@@ -1510,6 +1518,19 @@ int add_program_constant(char *name,
   return ret;
 }
 
+int add_object_constant(char *name,
+			struct object *o,
+			INT32 flags)
+{
+  INT32 ret;
+  struct svalue tmp;
+  tmp.type=T_OBJECT;
+  tmp.subtype=0;
+  tmp.u.object=o;
+  ret=simple_add_constant(name, &tmp, flags);
+  return ret;
+}
+
 int add_function_constant(char *name, void (*cfun)(INT32), char * type, INT16 flags)
 {
   struct svalue s;
@@ -1907,14 +1928,20 @@ char *get_line(unsigned char *pc,struct program *prog,INT32 *linep)
 
   while(cnt < prog->linenumbers + prog->num_linenumbers)
   {
+    int oline;
     if(*cnt == 127)
     {
       file=cnt+1;
       cnt=file+strlen(file)+1;
     }
     off+=get_small_number(&cnt);
-    if(off > offset) break;
+    oline=line;
     line+=get_small_number(&cnt);
+    if(off > offset)
+    {
+      linep[0]=oline;
+      return file;
+    }
   }
   linep[0]=line;
   return file;
diff --git a/src/program.h b/src/program.h
index 8a8b6ad7b15159125d4c6792eb55a5626935875d..855e1b008ca502141eb83c19eaa68fa6ef39435a 100644
--- a/src/program.h
+++ b/src/program.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: program.h,v 1.35 1998/03/28 15:36:22 grubba Exp $
+ * $Id: program.h,v 1.36 1998/04/06 04:31:32 hubbe Exp $
  */
 #ifndef PROGRAM_H
 #define PROGRAM_H
@@ -192,6 +192,7 @@ struct program
   void (*init)(struct object *);
   void (*exit)(struct object *);
   void (*gc_marked)(struct object *);
+  void (*gc_check)(struct object *);
 #ifdef DEBUG
   unsigned INT32 checksum;
 #endif
@@ -255,6 +256,7 @@ SIZE_T add_storage(SIZE_T size);
 void set_init_callback(void (*init)(struct object *));
 void set_exit_callback(void (*exit)(struct object *));
 void set_gc_mark_callback(void (*m)(struct object *));
+void set_gc_check_callback(void (*m)(struct object *));
 int low_reference_inherited_identifier(struct program_state *q,
 				       int e,
 				       struct pike_string *name);
@@ -311,6 +313,9 @@ int add_string_constant(char *name,
 int add_program_constant(char *name,
 			 struct program *p,
 			 INT32 flags);
+int add_object_constant(char *name,
+			struct object *o,
+			INT32 flags);
 int add_function_constant(char *name, void (*cfun)(INT32), char * type, INT16 flags);
 int debug_end_class(char *name, INT32 flags);
 INT32 define_function(struct pike_string *name,