pike.git/
src/
interpret_functions.h
Branch:
Tag:
Non-build tags
All tags
No tags
2012-06-10
2012-06-10 14:14:56 by Henrik Grubbström (Grubba) <grubba@grubba.org>
45dda900555988c31d877469ac70add4224f10d1 (
39
lines) (+
9
/-
30
)
[
Show
|
Annotate
]
Branch:
7.9
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; });