From d0477515f30f0b2612f5de10f4531026dab2798e Mon Sep 17 00:00:00 2001 From: gumi Date: Mon, 6 Jul 2020 18:07:56 +0000 Subject: ensure that returning builtins always return, else abort --- src/map/script-call.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/map/script-call.cpp') diff --git a/src/map/script-call.cpp b/src/map/script-call.cpp index 5541043..4de94d7 100644 --- a/src/map/script-call.cpp +++ b/src/map/script-call.cpp @@ -706,6 +706,28 @@ void run_func(ScriptState *st) } builtin_functions[func].func(st); + if (builtin_functions[func].ret != '\0') { + // this builtin is expected to return a value + script_data &back = st->stack->stack_datav.back(); + + if (builtin_functions[func].ret == 'i' && !back.is()) { + PRINTF("script-call:run_func: expected %s to push an integer but none was found. aborting script execution.\n"_fmt, builtin_functions[func].name); + st->state = ScriptEndState::END; + } else if (builtin_functions[func].ret == 's' && !back.is()) { + PRINTF("script-call:run_func: expected %s to push a string but none was found. aborting script execution.\n"_fmt, builtin_functions[func].name); + st->state = ScriptEndState::END; + } else if (builtin_functions[func].ret == 'v' && !back.is() && !back.is() && !back.is() && !back.is()) { + PRINTF("script-call:run_func: expected %s to push a value but none was found. aborting script execution.\n"_fmt, builtin_functions[func].name); + st->state = ScriptEndState::END; + } else if (builtin_functions[func].ret == 'r' && !back.is()) { + PRINTF("script-call:run_func: expected %s to push a variable reference but none was found. aborting script execution.\n"_fmt, builtin_functions[func].name); + st->state = ScriptEndState::END; + } else if (builtin_functions[func].ret == 'l' && !back.is()) { + PRINTF("script-call:run_func: expected %s to push a label pos but none was found. aborting script execution.\n"_fmt, builtin_functions[func].name); + st->state = ScriptEndState::END; + } + } + pop_stack(st->stack, start_sp, end_sp); if (st->state == ScriptEndState::RETFUNC) -- cgit v1.2.3-60-g2f50