From c6bc9664cac96af1e7e3f680f9eaa149f1753626 Mon Sep 17 00:00:00 2001
From: Martin Stjernholm <mast@lysator.liu.se>
Date: Sun, 11 May 2008 01:27:05 +0200
Subject: [PATCH] Don't keep extra refs to programs in the backlog; it has too
 much side effects.

Rev: src/interpret.c:1.397
---
 src/interpret.c | 34 +++++++++++-----------------------
 1 file changed, 11 insertions(+), 23 deletions(-)

diff --git a/src/interpret.c b/src/interpret.c
index 6d2a38ba06..fbf9e30100 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: interpret.c,v 1.396 2008/05/10 11:53:41 grubba Exp $
+|| $Id: interpret.c,v 1.397 2008/05/10 23:27:05 mast Exp $
 */
 
 #include "global.h"
@@ -851,7 +851,7 @@ struct backlog
 {
   PIKE_INSTR_T instruction;
   INT32 arg,arg2;
-  struct program *program;
+  INT32 program_id;
   PIKE_OPCODE_T *pc;
 #ifdef _REENTRANT
   struct thread_state *thread_state;
@@ -902,11 +902,7 @@ static INLINE void low_debug_instr_prologue (PIKE_INSTR_T instr)
     backlogp++;
     if(backlogp >= BACKLOG) backlogp=0;
 
-    if(backlog[backlogp].program)
-      free_program(backlog[backlogp].program);
-
-    backlog[backlogp].program=Pike_fp->context->prog;
-    add_ref(Pike_fp->context->prog);
+    backlog[backlogp].program_id = Pike_fp->context->prog->id;
     backlog[backlogp].instruction=instr;
     backlog[backlogp].pc = Pike_fp->pc;
     backlog[backlogp].stack = Pike_sp - Pike_interpreter.evaluator_stack;
@@ -1006,10 +1002,12 @@ void dump_backlog(void)
   e=backlogp;
   do
   {
+    struct program *p;
     e++;
     if(e>=BACKLOG) e=0;
 
-    if(backlog[e].program)
+    p = id_to_program (backlog[e].program_id);
+    if (p)
     {
       struct pike_string *file;
       INT32 line;
@@ -1022,12 +1020,12 @@ void dump_backlog(void)
       }
 #endif
 
-      file = get_line(backlog[e].pc,backlog[e].program, &line);
+      file = get_line(backlog[e].pc,p, &line);
 #ifdef HAVE_COMPUTED_GOTO
       fprintf(stderr,"%s:%ld:(%"PRINTPTRDIFFT"d): %s",
 	      file->str,
 	      (long)line,
-	      backlog[e].pc - backlog[e].program->program,
+	      backlog[e].pc - p->program,
 	      get_opcode_name(backlog[e].instruction));
 #else /* !HAVE_COMPUTED_GOTO */
       if(backlog[e].instruction+F_OFFSET > F_MAX_OPCODE)
@@ -1035,7 +1033,7 @@ void dump_backlog(void)
 	fprintf(stderr,"%s:%ld:(%"PRINTPTRDIFFT"d): ILLEGAL INSTRUCTION %d\n",
 		file->str,
 		(long)line,
-		backlog[e].pc - backlog[e].program->program,
+		backlog[e].pc - p->program,
 		backlog[e].instruction + F_OFFSET);
 	free_string(file);
 	continue;
@@ -1044,8 +1042,8 @@ void dump_backlog(void)
       fprintf(stderr,"%s:%ld:(%"PRINTPTRDIFFT"d): %s",
 	      file->str,
 	      (long)line,
-	      backlog[e].pc - backlog[e].program->program,
-	      low_get_f_name(backlog[e].instruction + F_OFFSET, backlog[e].program));
+	      backlog[e].pc - p->program,
+	      low_get_f_name(backlog[e].instruction + F_OFFSET, p));
       if(instrs[backlog[e].instruction].flags & I_HASARG2)
       {
 	fprintf(stderr,"(%ld,%ld)",
@@ -3004,16 +3002,6 @@ PMOD_EXPORT void cleanup_interpret(void)
   while(Pike_fp)
     POP_PIKE_FRAME();
 
-#ifdef PIKE_DEBUG
-  for(e=0;e<BACKLOG;e++)
-  {
-    if(backlog[e].program)
-    {
-      free_program(backlog[e].program);
-      backlog[e].program=0;
-    }
-  }
-#endif
   reset_evaluator();
 
   low_cleanup_interpret(&Pike_interpreter);
-- 
GitLab