Skip to content

Commit 97d7b18

Browse files
committed
fix: ensure sufficient arguments on stack for JIT-compiled function calls
1 parent 3834e25 commit 97d7b18

2 files changed

Lines changed: 11 additions & 1 deletion

File tree

lib/execution_tree/JitCompilingFunction.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ class JitCompilingFunction : public IFunctionExecutable {
2626
std::expected<ExecutionResult, std::runtime_error> Execute(PassedExecutionData& execution_data) override {
2727
if (function_.GetTotalActionCount() > jit_action_boundary_) {
2828
if (executor_->TryCompile()) {
29+
if (execution_data.memory.machine_stack.size() < function_.GetArity()) {
30+
return std::unexpected<std::runtime_error>(std::runtime_error(
31+
"Not enough arguments on the stack to call JIT-compiled function " + function_.GetId()));
32+
}
33+
2934
runtime::StackFrame local_frame{};
3035
local_frame.function_name = function_.GetId();
3136
local_frame.local_variables.reserve(function_.GetArity());
@@ -38,12 +43,17 @@ class JitCompilingFunction : public IFunctionExecutable {
3843
execution_data.memory.stack_frames.push(std::move(local_frame));
3944

4045
const std::expected<void, std::runtime_error> jit_result = executor_->Run(execution_data);
46+
const runtime::StackFrame& local_frame_ref = execution_data.memory.stack_frames.top();
4147

4248
execution_data.memory.stack_frames.pop();
4349

4450
if (jit_result.has_value()) {
4551
return ExecutionResult::kNormal;
4652
}
53+
54+
for (size_t i = 0; i < function_.GetArity(); ++i) {
55+
execution_data.memory.machine_stack.push(local_frame_ref.local_variables[function_.GetArity() - i - 1]);
56+
}
4757
}
4858
}
4959

0 commit comments

Comments
 (0)