Files
AncientCivil/Plugins/Puerts/Source/JsEnv/Private/PromiseRejectCallback.hpp
T
2025-02-10 00:44:11 +08:00

114 lines
3.1 KiB
C++

#pragma once
#include <sstream>
#if !defined(PUERTS_NAMESPACE)
#if defined(WITH_QJS_NAMESPACE_SUFFIX)
#define PUERTS_NAMESPACE puerts_qjs
#else
#define PUERTS_NAMESPACE puerts
#endif
#endif
namespace PUERTS_NAMESPACE
{
template <typename T>
inline void __USE(T&&)
{
}
template <typename T>
void PromiseRejectCallback(v8::PromiseRejectMessage Message)
{
auto Promise = Message.GetPromise();
auto Isolate = Promise->GetIsolate();
auto Event = Message.GetEvent();
auto JsEngine = T::Get(Isolate);
auto Callback = JsEngine->JsPromiseRejectCallback.Get(Isolate);
if (Callback.IsEmpty())
{
return;
}
v8::Local<v8::Value> Value;
if (Event == v8::kPromiseRejectWithNoHandler)
{
Value = Message.GetValue();
}
else if (Event == v8::kPromiseHandlerAddedAfterReject)
{
Value = v8::Undefined(Isolate);
}
else if (Event == v8::kPromiseResolveAfterResolved)
{
Value = Message.GetValue();
}
else if (Event == v8::kPromiseRejectAfterResolved)
{
Value = Message.GetValue();
}
else
{
return;
}
if (Value.IsEmpty())
{
Value = v8::Undefined(Isolate);
}
v8::Local<v8::Value> Args[] = {v8::Number::New(Isolate, Event), Promise, Value};
__USE(Callback->Call(Isolate->GetCurrentContext(), v8::Undefined(Isolate), 3, Args));
}
template <typename T>
void SetPromiseRejectCallback(const v8::FunctionCallbackInfo<v8::Value>& Args)
{
auto Isolate = Args.GetIsolate();
auto JsEngine = T::Get(Isolate);
JsEngine->JsPromiseRejectCallback.Reset(Isolate, Args[0].As<v8::Function>());
}
// TODO: rename this file
#ifndef WITH_QUICKJS
std::string StackTraceToString(v8::Isolate* InIsolate, v8::Local<v8::StackTrace> InStack)
{
std::ostringstream stm;
for (int i = 0; i < InStack->GetFrameCount(); i++)
{
v8::Local<v8::StackFrame> StackFrame = InStack->GetFrame(InIsolate, i);
v8::String::Utf8Value FuncName(InIsolate, StackFrame->GetFunctionName());
v8::String::Utf8Value ScriptName(InIsolate, StackFrame->GetScriptName());
const int LineNumber = StackFrame->GetLineNumber();
const int Column = StackFrame->GetColumn();
if (StackFrame->IsEval())
{
if (StackFrame->GetScriptId() == v8::Message::kNoScriptIdInfo)
{
stm << " at [eval]:" << LineNumber << ":" << Column << std::endl;
}
else
{
stm << " at [eval] (" << (*ScriptName ? *ScriptName : "anonymous") << ":" << LineNumber << ":" << Column << ")"
<< std::endl;
}
break;
}
if (FuncName.length() == 0)
{
stm << " at " << (*ScriptName ? *ScriptName : "anonymous") << ":" << LineNumber << ":" << Column << std::endl;
}
else
{
stm << " at " << *FuncName << "(" << (*ScriptName ? *ScriptName : "anonymous") << ":" << LineNumber << ":" << Column
<< ")" << std::endl;
}
}
return stm.str();
}
#endif
} // namespace PUERTS_NAMESPACE