114 lines
3.1 KiB
C++
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
|