diff --git a/runtime/interpreter/ecma-interpreter-inl.h b/runtime/interpreter/ecma-interpreter-inl.h index be6c0ae1fa91e853081e1d9c15ed70f8f1721bb8..0b488acb96906dcb011b27aa3f781f971f591144 100644 --- a/runtime/interpreter/ecma-interpreter-inl.h +++ b/runtime/interpreter/ecma-interpreter-inl.h @@ -562,18 +562,24 @@ public: Frame *frame = JSFrame::CreateNativeFrame(thread, method, thread->GetCurrentFrame(), num_args, num_actual_args); - JSCopyArgumets(this->GetJSThread(), prev_frame, ctor.GetRawData(), - prev_inst, frame, 0, num_actual_args); - frame->GetVReg(0 + js_method_args::THIS_IDX).SetValue(JSTaggedValue::VALUE_UNDEFINED); - - // Call native method - thread->SetCurrentFrame(frame); - JSTaggedValue ret_value = JSFrame::ExecuteNativeMethod(thread, frame, method, num_actual_args); - ASSERT(thread->GetCurrentFrame() == frame); - thread->SetCurrentFrameIsCompiled(false); - thread->SetCurrentFrame(prev_frame); - - JSFrame::DestroyNativeFrame(thread, frame); + JSTaggedValue ret_value; + if (UNLIKELY(frame == nullptr)) { + ret_value = JSTaggedValue::Exception(); + } else { + JSCopyArgumets(this->GetJSThread(), prev_frame, ctor.GetRawData(), + prev_inst, frame, 0, num_actual_args); + frame->GetVReg(0 + js_method_args::THIS_IDX).SetValue(JSTaggedValue::VALUE_UNDEFINED); + + // Call native method + thread->SetCurrentFrame(frame); + ret_value = JSFrame::ExecuteNativeMethod(thread, frame, method, num_actual_args); + + ASSERT(thread->GetCurrentFrame() == frame); + thread->SetCurrentFrameIsCompiled(false); + thread->SetCurrentFrame(prev_frame); + JSFrame::DestroyNativeFrame(thread, frame); + } + if (UNLIKELY(thread->HasPendingException())) { this->MoveToExceptionHandler(); return; diff --git a/runtime/interpreter/js_frame-inl.h b/runtime/interpreter/js_frame-inl.h index d513663a09e9e481a0062fe5d5de2cc739316261..3f529b5e348afba1cd2eb5bca810e94bb62f1b6b 100644 --- a/runtime/interpreter/js_frame-inl.h +++ b/runtime/interpreter/js_frame-inl.h @@ -20,6 +20,9 @@ inline Frame *JSFrame::CreateNativeFrame(JSThread *js_thread, Method *method, Fr Frame *new_frame = CreateFrame(js_thread->GetStackFrameAllocator(), nregs, method, prev_frame, nregs, num_actual_args); + if (UNLIKELY(new_frame == nullptr)) { + return nullptr; + } LOG_IF(new_frame == nullptr, FATAL, ECMASCRIPT) << "Cannot allocate native frame"; new_frame->SetInvoke(); new_frame->SetDynamic(); diff --git a/runtime/js_thread.cpp b/runtime/js_thread.cpp index 415753971b700bd9e51346c674b0dcd0bc11ce28..9101caa20bde71bdbc13c87d30c6214180b25a9e 100644 --- a/runtime/js_thread.cpp +++ b/runtime/js_thread.cpp @@ -216,4 +216,17 @@ void JSThread::ResetGuardians() { stable_array_elements_guardians_ = true; } + +void JSThread::DisableStackOverflowCheck() +{ + GetStackFrameAllocator()->UseWholeMemory(); + ManagedThread::DisableStackOverflowCheck(); +} + +void JSThread::EnableStackOverflowCheck() +{ + GetStackFrameAllocator()->ReserveMemory(); + ManagedThread::EnableStackOverflowCheck(); +} + } // namespace panda::ecmascript diff --git a/runtime/js_thread.h b/runtime/js_thread.h index 552bc97fde15ab8f67bbf2e638f2e37f6353e6f8..4e334bee05b93a410d1bf785f9e00fc841b932ce 100644 --- a/runtime/js_thread.h +++ b/runtime/js_thread.h @@ -231,6 +231,9 @@ public: return global_obj_; } + void DisableStackOverflowCheck() override; + void EnableStackOverflowCheck() override; + private: void IterateEcmascriptEnvironment(const RootVisitor &v0, const RootRangeVisitor &v1);