Branch: Tag:

2001-06-23

2001-06-23 10:33:11 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

avoid generating tail recursion inside catch()

Rev: src/docode.c:1.121
Rev: src/interpret.c:1.208
Rev: src/opcodes.h:1.17
Rev: src/peep.c:1.47
Rev: src/peep.in:1.53
Rev: src/testsuite.in:1.427

5:   \*/   /**/   #include "global.h" - RCSID("$Id: interpret.c,v 1.207 2001/06/19 23:59:33 hubbe Exp $"); + RCSID("$Id: interpret.c,v 1.208 2001/06/23 10:33:11 hubbe Exp $");   #include "interpret.h"   #include "object.h"   #include "program.h"
1430:    struct pike_frame *current, *prev;    struct svalue *target, **smsp;    int freespace; +     current=Pike_interpreter.frame_pointer; -  prev=Pike_interpreter.frame_pointer=current->next; +  prev=current->next; + #ifdef PIKE_DEBUG +  { +  JMP_BUF *rec;    -  +  if((rec=Pike_interpreter.recoveries)) +  { +  while(rec->frame_pointer == current) rec=rec->previous; +  if(rec->frame_pointer == current->next) +  fatal("You can't touch this!\n"); +  } +  } + #endif +  +  Pike_interpreter.frame_pointer=prev; +     target=prev->save_sp;    smsp=prev->save_mark_sp;    current->flags=prev->flags;
1444:    current->save_sp=target;    current->save_mark_sp=smsp;    - #if 1 +     /* Move svalues down */    freespace=fp->locals - target;    if(freespace > ((Pike_sp - fp->locals)<<2) + 32)
1469: Inside #if 1
   fp->mark_sp_base-=freespace;    Pike_mark_sp-=freespace;    } - #endif +    }