pike.git/
src/
interpret.c
Branch:
Tag:
Non-build tags
All tags
No tags
2017-11-18
2017-11-18 10:14:46 by Arne Goedeke <el@laramies.com>
53e8a8816efc5b18f38d63db28ac8d33473f4fee (
71
lines) (+
26
/-
45
)
[
Show
|
Annotate
]
Branch:
arne/faster_calls_again
Interpreter: remove some duplicate code
2326:
PMOD_EXPORT void mega_apply(enum apply_type type, INT32 args, void *arg1, void *arg2) {
-
/*
Save and clear Pike
_
interpreter.catching_eval_jmpbuf
so that the
-
* following eval_instruction will install a LOW_JMP_BUF of its
-
* own to handle catches. */
-
LOW_JMP_BUF *saved_jmpbuf = Pike_interpreter.catching_eval_jmpbuf
;
-
ONERROR uwp;
-
Pike_interpreter.catching_eval_jmpbuf = NULL;
-
SET_ONERROR (uwp, restore_catching_eval_jmpbuf, saved_jmpbuf);
+
struct
pike
_
callsite
C
;
-
/* The
C
stack margin is normally 8 kb
,
but
if
we
get
here during a
-
*
lowered
margin
then
don't
fail
just because of that, unless it's
-
*
practically
zero.
*/
-
check
_
c
_
stack
(
Pike_interpreter.c_stack_margin
?
-
Pike_
interpreter.c_stack_margin
:
100
);
-
if(
low_mega_apply(type,
args,
arg1,
arg2) )
-
{
-
eval
_
instruction(Pike
_
fp->pc
-
#ifdef
ENTRY_PROLOGUE_SIZE
-
- ENTRY
_
PROLOGUE
_
SIZE
-
#endif
/*
ENTRY_PROLOGUE_SIZE
*/
-
);
-
low_return()
;
+
callsite_init(&
C,
args);
+
+
switch
(type)
{
+
case
APPLY_STACK:
+
C.args--;
+
callsite
_
resolve
_
svalue
(
&C,
Pike_
sp
-
args
);
+
break;
+
case
APPLY
_
SVALUE
_
STRICT:
+
C.flags
|=
CALL
_
NEED
_
NO_RETVAL;
+
case APPLY
_
SVALUE:
+
callsite_resolve_svalue(&C,
arg1
);
+
break
;
}
-
CALL
_
AND
_
UNSET
_
ONERROR
(
uwp
);
+
+
callsite
_
prepare(&C);
+
callsite
_
execute(&C);
+
callsite
_
free
(
&C
);
} PMOD_EXPORT void mega_apply_low(INT32 args, struct object *o, ptrdiff_t fun) {
-
/*
Save and clear Pike
_
interpreter.catching_eval_jmpbuf
so that the
-
* following eval_instruction will install a LOW_JMP_BUF of its
-
* own to handle catches. */
-
LOW_JMP_BUF *saved_jmpbuf = Pike_interpreter.catching_eval_jmpbuf
;
-
ONERROR uwp;
-
Pike_interpreter.catching_eval_jmpbuf = NULL;
-
SET_ONERROR (uwp, restore_catching_eval_jmpbuf, saved_jmpbuf);
+
struct
pike
_
callsite
C
;
-
/* The
C
stack margin is normally 8 kb
,
but if we get here during a
-
* lowered margin then don't fail just because of that, unless it's
-
* practically zero. */
-
check_c_stack(Pike_interpreter.c_stack_margin ?
-
Pike_interpreter.c_stack_margin : 100
);
-
if( lower
_
mega
_
apply
(
args
, o, fun
)
)
-
{
-
eval
_
instruction
(
Pike_fp->pc
-
#ifdef
ENTRY_PROLOGUE_SIZE
-
- ENTRY
_
PROLOGUE_SIZE
-
#endif /* ENTRY_PROLOGUE_SIZE */
-
);
-
low
_
return
();
+
callsite_init(&
C,
args
);
+
callsite
_
resolve
_
fun
(
&C
, o, fun)
;
+
callsite
_
prepare
(
&C);
+
callsite
_
execute(&C
);
+
callsite
_
free
(
&C
);
}
-
CALL_AND_UNSET_ONERROR(uwp);
-
}
+
/* Put catch outside of eval_instruction, so the setjmp won't affect * the optimization of eval_instruction.