Branch: Tag:

2008-05-10

2008-05-10 23:27:05 by Martin Stjernholm <mast@lysator.liu.se>

Don't keep extra refs to programs in the backlog; it has too much side
effects.

Rev: src/interpret.c:1.397

2:   || 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:   {    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:    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:    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:    }   #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:    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:    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:    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);