瀏覽代碼

LibJS/Bytecode: Do a stack check when entering run_bytecode()

If we don't have enough stack space, throw an exception while we still
can, and give the caller a chance to recover.

This particular problem will go away once we make calls non-recursive.
Andreas Kling 1 年之前
父節點
當前提交
a020a0779d
共有 1 個文件被更改,包括 5 次插入0 次删除
  1. 5 0
      Userland/Libraries/LibJS/Bytecode/Interpreter.cpp

+ 5 - 0
Userland/Libraries/LibJS/Bytecode/Interpreter.cpp

@@ -339,6 +339,11 @@ Interpreter::HandleExceptionResponse Interpreter::handle_exception(size_t& progr
 
 
 FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
 FLATTEN_ON_CLANG void Interpreter::run_bytecode(size_t entry_point)
 {
 {
+    if (vm().did_reach_stack_space_limit()) {
+        reg(Register::exception()) = vm().throw_completion<InternalError>(ErrorType::CallStackSizeExceeded).release_value().value();
+        return;
+    }
+
     auto& running_execution_context = vm().running_execution_context();
     auto& running_execution_context = vm().running_execution_context();
     auto* locals = running_execution_context.locals.data();
     auto* locals = running_execution_context.locals.data();
     auto& accumulator = this->accumulator();
     auto& accumulator = this->accumulator();