mirror of
https://github.com/janet-lang/janet
synced 2024-12-24 23:40:27 +00:00
Address #1005 - Fix janet_call stack clobbering on dirty stack.
This commit is contained in:
parent
f443a3b3a1
commit
79c375b1af
@ -437,6 +437,8 @@ static Janet cfun_io_print_impl_x(int32_t argc, Janet *argv, int newline,
|
|||||||
if (newline)
|
if (newline)
|
||||||
janet_buffer_push_u8(buf, '\n');
|
janet_buffer_push_u8(buf, '\n');
|
||||||
Janet args[1] = { janet_wrap_buffer(buf) };
|
Janet args[1] = { janet_wrap_buffer(buf) };
|
||||||
|
/* Disable tracing */
|
||||||
|
fun->gc.flags &= ~JANET_FUNCFLAG_TRACE;
|
||||||
janet_call(fun, 1, args);
|
janet_call(fun, 1, args);
|
||||||
return janet_wrap_nil();
|
return janet_wrap_nil();
|
||||||
}
|
}
|
||||||
@ -552,6 +554,8 @@ static Janet cfun_io_printf_impl_x(int32_t argc, Janet *argv, int newline,
|
|||||||
janet_buffer_format(buf, fmt, offset, argc, argv);
|
janet_buffer_format(buf, fmt, offset, argc, argv);
|
||||||
if (newline) janet_buffer_push_u8(buf, '\n');
|
if (newline) janet_buffer_push_u8(buf, '\n');
|
||||||
Janet args[1] = { janet_wrap_buffer(buf) };
|
Janet args[1] = { janet_wrap_buffer(buf) };
|
||||||
|
/* Disable tracing */
|
||||||
|
fun->gc.flags &= ~JANET_FUNCFLAG_TRACE;
|
||||||
janet_call(fun, 1, args);
|
janet_call(fun, 1, args);
|
||||||
return janet_wrap_nil();
|
return janet_wrap_nil();
|
||||||
}
|
}
|
||||||
|
@ -1285,6 +1285,12 @@ JanetSignal janet_step(JanetFiber *fiber, Janet in, Janet *out) {
|
|||||||
return signal;
|
return signal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Janet void_cfunction(int32_t argc, Janet *argv) {
|
||||||
|
(void) argc;
|
||||||
|
(void) argv;
|
||||||
|
janet_panic("placeholder");
|
||||||
|
}
|
||||||
|
|
||||||
Janet janet_call(JanetFunction *fun, int32_t argc, const Janet *argv) {
|
Janet janet_call(JanetFunction *fun, int32_t argc, const Janet *argv) {
|
||||||
/* Check entry conditions */
|
/* Check entry conditions */
|
||||||
if (!janet_vm.fiber)
|
if (!janet_vm.fiber)
|
||||||
@ -1292,9 +1298,17 @@ Janet janet_call(JanetFunction *fun, int32_t argc, const Janet *argv) {
|
|||||||
if (janet_vm.stackn >= JANET_RECURSION_GUARD)
|
if (janet_vm.stackn >= JANET_RECURSION_GUARD)
|
||||||
janet_panic("C stack recursed too deeply");
|
janet_panic("C stack recursed too deeply");
|
||||||
|
|
||||||
|
/* Dirty stack */
|
||||||
|
int32_t dirty_stack = janet_vm.fiber->stacktop - janet_vm.fiber->stackstart;
|
||||||
|
if (dirty_stack) {
|
||||||
|
janet_fiber_cframe(janet_vm.fiber, void_cfunction);
|
||||||
|
}
|
||||||
|
|
||||||
/* Tracing */
|
/* Tracing */
|
||||||
if (fun->gc.flags & JANET_FUNCFLAG_TRACE) {
|
if (fun->gc.flags & JANET_FUNCFLAG_TRACE) {
|
||||||
|
janet_vm.stackn++;
|
||||||
vm_do_trace(fun, argc, argv);
|
vm_do_trace(fun, argc, argv);
|
||||||
|
janet_vm.stackn--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Push frame */
|
/* Push frame */
|
||||||
@ -1322,6 +1336,10 @@ Janet janet_call(JanetFunction *fun, int32_t argc, const Janet *argv) {
|
|||||||
/* Teardown */
|
/* Teardown */
|
||||||
janet_vm.stackn = oldn;
|
janet_vm.stackn = oldn;
|
||||||
janet_gcunlock(handle);
|
janet_gcunlock(handle);
|
||||||
|
if (dirty_stack) {
|
||||||
|
janet_fiber_popframe(janet_vm.fiber);
|
||||||
|
janet_vm.fiber->stacktop += dirty_stack;
|
||||||
|
}
|
||||||
|
|
||||||
if (signal != JANET_SIGNAL_OK) {
|
if (signal != JANET_SIGNAL_OK) {
|
||||||
janet_panicv(*janet_vm.return_reg);
|
janet_panicv(*janet_vm.return_reg);
|
||||||
|
Loading…
Reference in New Issue
Block a user