Branch: Tag:

2012-06-10

2012-06-10 14:14:56 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Compiler: Moved stack frame initialization to the byte-code.

2450:   #define DO_RECUR(XFLAGS) do{ \    PIKE_OPCODE_T *addr; \    register struct pike_frame *new_frame; \ -  ptrdiff_t args; \ +  INT32 args = DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)); \    \    DO_IF_SECURITY(CHECK_DATA_SECURITY_OR_ERROR(Pike_fp->current_object, \    SECURITY_BIT_CALL, \
2468:    Pike_fp->return_addr = (PIKE_OPCODE_T *)(((INT32 *) addr) + 1); \    addr += GET_JUMP(); \    \ -  new_frame->num_locals = READ_INCR_BYTE(addr); \ -  args = READ_INCR_BYTE(addr); \ +     addr += ENTRY_PROLOGUE_SIZE; \    \ -  new_frame->num_args = new_frame->args = args; \ +  if (Pike_interpreter.trace_level > 3) { \ +  fprintf(stderr, "- Addr = 0x%+lx\n", addr); \ +  } \ +  \ +  new_frame->args = args; \    new_frame->locals=new_frame->save_sp=new_frame->expendible=Pike_sp-args; \    new_frame->save_mark_sp = new_frame->mark_sp_base = Pike_mark_sp; \    \ -  push_zeroes(new_frame->num_locals - args); \ -  \ -  DO_IF_DEBUG({ \ -  if(Pike_interpreter.trace_level > 3) \ -  fprintf(stderr,"- Allocating %d extra locals.\n", \ -  new_frame->num_locals - new_frame->num_args); \ -  if (Pike_fp && (new_frame->locals < Pike_fp->locals)) { \ -  fatal("New locals below old locals: %p < %p\n", \ -  new_frame->locals, Pike_fp->locals); \ -  } \ -  }); \ -  \ -  \ +     SET_PROG_COUNTER(addr); \    new_frame->fun=Pike_fp->fun; \    DO_IF_PROFILING( new_frame->ident=Pike_fp->ident ); \
2556:    {    PIKE_OPCODE_T *faddr;    ptrdiff_t num_locals; -  ptrdiff_t args; +  INT32 args = DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp));       JUMP_SET_TO_PC_AT_NEXT (faddr);    faddr += GET_JUMP(); -  num_locals = READ_INCR_BYTE(faddr); /* ignored */ -  args = READ_INCR_BYTE(faddr); +        if(low_mega_apply(APPLY_LOW,    args,
2595:   OPCODE0_PTRJUMP(F_TAIL_RECUR, "tail recursion", I_UPDATE_ALL, {    INT32 num_locals;    PIKE_OPCODE_T *addr; -  INT32 args; +  INT32 args = DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp));       FAST_CHECK_THREADS_ON_CALL();       JUMP_SET_TO_PC_AT_NEXT (addr);    addr += GET_JUMP(); -  num_locals = READ_INCR_BYTE(addr); -  args = READ_INCR_BYTE(addr); +     addr += ENTRY_PROLOGUE_SIZE;    SET_PROG_COUNTER(addr);   
2617:    pop_n_elems(Pike_sp - (Pike_fp->locals + args));    }    -  push_zeroes(num_locals - args); -  -  DO_IF_DEBUG({ -  if(Pike_sp != Pike_fp->locals + Pike_fp->num_locals) -  Pike_fatal("Sp whacked!\n"); -  }); -  +     FETCH;    JUMP_DONE;   });