From f0c3d3289a6e4dcaa5976edbe4687dfe6c9b40a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Sun, 5 Apr 1998 21:31:32 -0700
Subject: [PATCH] bug in line numbering fixed + more garbage collection stuff
 added

Rev: src/program.c:1.68
Rev: src/program.h:1.36
---
 src/program.c | 31 +++++++++++++++++++++++++++++--
 src/program.h |  7 ++++++-
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/program.c b/src/program.c
index b5921c041d..ef1c15be05 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 8a8b6ad7b1..855e1b008c 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,
-- 
GitLab