357 lines
12 KiB
C
357 lines
12 KiB
C
|
/*********************************************************************
|
||
|
* NAN - Native Abstractions for Node.js
|
||
|
*
|
||
|
* Copyright (c) 2018 NAN contributors
|
||
|
*
|
||
|
* MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
|
||
|
********************************************************************/
|
||
|
|
||
|
#ifndef NAN_MAYBE_43_INL_H_
|
||
|
#define NAN_MAYBE_43_INL_H_
|
||
|
|
||
|
template<typename T>
|
||
|
using MaybeLocal = v8::MaybeLocal<T>;
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::String> ToDetailString(v8::Local<v8::Value> val) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(val->ToDetailString(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::String>()));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::Uint32> ToArrayIndex(v8::Local<v8::Value> val) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(val->ToArrayIndex(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::Uint32>()));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Maybe<bool> Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b)) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return a->Equals(isolate->GetCurrentContext(), b);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::Object> NewInstance(v8::Local<v8::Function> h) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::Object>()));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::Object> NewInstance(
|
||
|
v8::Local<v8::Function> h
|
||
|
, int argc
|
||
|
, v8::Local<v8::Value> argv[]) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(h->NewInstance(isolate->GetCurrentContext(), argc, argv)
|
||
|
.FromMaybe(v8::Local<v8::Object>()));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::Object> NewInstance(v8::Local<v8::ObjectTemplate> h) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::Object>()));
|
||
|
}
|
||
|
|
||
|
|
||
|
inline MaybeLocal<v8::Function> GetFunction(
|
||
|
v8::Local<v8::FunctionTemplate> t) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(t->GetFunction(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::Function>()));
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> Set(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::Value> key
|
||
|
, v8::Local<v8::Value> value) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->Set(isolate->GetCurrentContext(), key, value);
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> Set(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, uint32_t index
|
||
|
, v8::Local<v8::Value> value) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->Set(isolate->GetCurrentContext(), index, value);
|
||
|
}
|
||
|
|
||
|
#if NODE_MODULE_VERSION < NODE_4_0_MODULE_VERSION
|
||
|
#include "nan_define_own_property_helper.h" // NOLINT(build/include)
|
||
|
#endif
|
||
|
|
||
|
inline Maybe<bool> DefineOwnProperty(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key
|
||
|
, v8::Local<v8::Value> value
|
||
|
, v8::PropertyAttribute attribs = v8::None) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
#if NODE_MODULE_VERSION >= NODE_4_0_MODULE_VERSION
|
||
|
return obj->DefineOwnProperty(isolate->GetCurrentContext(), key, value,
|
||
|
attribs);
|
||
|
#else
|
||
|
Maybe<v8::PropertyAttribute> maybeCurrent =
|
||
|
obj->GetPropertyAttributes(isolate->GetCurrentContext(), key);
|
||
|
if (maybeCurrent.IsNothing()) {
|
||
|
return Nothing<bool>();
|
||
|
}
|
||
|
v8::PropertyAttribute current = maybeCurrent.FromJust();
|
||
|
return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
NAN_DEPRECATED inline Maybe<bool> ForceSet(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::Value> key
|
||
|
, v8::Local<v8::Value> value
|
||
|
, v8::PropertyAttribute attribs = v8::None) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
|
||
|
return key->IsName()
|
||
|
? obj->DefineOwnProperty(isolate->GetCurrentContext(),
|
||
|
key.As<v8::Name>(), value, attribs)
|
||
|
: Nothing<bool>();
|
||
|
#else
|
||
|
return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::Value> Get(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::Value> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(obj->Get(isolate->GetCurrentContext(), key)
|
||
|
.FromMaybe(v8::Local<v8::Value>()));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::Value> Get(v8::Local<v8::Object> obj, uint32_t index) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(obj->Get(isolate->GetCurrentContext(), index)
|
||
|
.FromMaybe(v8::Local<v8::Value>()));
|
||
|
}
|
||
|
|
||
|
inline v8::PropertyAttribute GetPropertyAttributes(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::Value> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->GetPropertyAttributes(isolate->GetCurrentContext(), key)
|
||
|
.FromJust();
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> Has(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->Has(isolate->GetCurrentContext(), key);
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> Has(v8::Local<v8::Object> obj, uint32_t index) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->Has(isolate->GetCurrentContext(), index);
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> Delete(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->Delete(isolate->GetCurrentContext(), key);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
Maybe<bool> Delete(v8::Local<v8::Object> obj, uint32_t index) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->Delete(isolate->GetCurrentContext(), index);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::Array> GetPropertyNames(v8::Local<v8::Object> obj) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(obj->GetPropertyNames(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::Array>()));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Local<v8::Object> obj) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(obj->GetOwnPropertyNames(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::Array>()));
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> SetPrototype(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::Value> prototype) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->SetPrototype(isolate->GetCurrentContext(), prototype);
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::String> ObjectProtoToString(
|
||
|
v8::Local<v8::Object> obj) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(obj->ObjectProtoToString(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::String>()));
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> HasOwnProperty(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->HasOwnProperty(isolate->GetCurrentContext(), key);
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> HasRealNamedProperty(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->HasRealNamedProperty(isolate->GetCurrentContext(), key);
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> HasRealIndexedProperty(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, uint32_t index) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->HasRealIndexedProperty(isolate->GetCurrentContext(), index);
|
||
|
}
|
||
|
|
||
|
inline Maybe<bool> HasRealNamedCallbackProperty(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return obj->HasRealNamedCallbackProperty(isolate->GetCurrentContext(), key);
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(obj->GetRealNamedPropertyInPrototypeChain(
|
||
|
isolate->GetCurrentContext(), key)
|
||
|
.FromMaybe(v8::Local<v8::Value>()));
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::Value> GetRealNamedProperty(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::String> key) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(
|
||
|
obj->GetRealNamedProperty(isolate->GetCurrentContext(), key)
|
||
|
.FromMaybe(v8::Local<v8::Value>()));
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::Value> CallAsFunction(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, v8::Local<v8::Object> recv
|
||
|
, int argc
|
||
|
, v8::Local<v8::Value> argv[]) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(
|
||
|
obj->CallAsFunction(isolate->GetCurrentContext(), recv, argc, argv)
|
||
|
.FromMaybe(v8::Local<v8::Value>()));
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::Value> CallAsConstructor(
|
||
|
v8::Local<v8::Object> obj
|
||
|
, int argc, v8::Local<v8::Value> argv[]) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(
|
||
|
obj->CallAsConstructor(isolate->GetCurrentContext(), argc, argv)
|
||
|
.FromMaybe(v8::Local<v8::Value>()));
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
MaybeLocal<v8::String> GetSourceLine(v8::Local<v8::Message> msg) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(msg->GetSourceLine(isolate->GetCurrentContext())
|
||
|
.FromMaybe(v8::Local<v8::String>()));
|
||
|
}
|
||
|
|
||
|
inline Maybe<int> GetLineNumber(v8::Local<v8::Message> msg) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return msg->GetLineNumber(isolate->GetCurrentContext());
|
||
|
}
|
||
|
|
||
|
inline Maybe<int> GetStartColumn(v8::Local<v8::Message> msg) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return msg->GetStartColumn(isolate->GetCurrentContext());
|
||
|
}
|
||
|
|
||
|
inline Maybe<int> GetEndColumn(v8::Local<v8::Message> msg) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::HandleScope scope(isolate);
|
||
|
return msg->GetEndColumn(isolate->GetCurrentContext());
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::Object> CloneElementAt(
|
||
|
v8::Local<v8::Array> array
|
||
|
, uint32_t index) {
|
||
|
#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
v8::Local<v8::Context> context = isolate->GetCurrentContext();
|
||
|
v8::Local<v8::Value> elem;
|
||
|
v8::Local<v8::Object> obj;
|
||
|
if (!array->Get(context, index).ToLocal(&elem)) {
|
||
|
return scope.Escape(obj);
|
||
|
}
|
||
|
if (!elem->ToObject(context).ToLocal(&obj)) {
|
||
|
return scope.Escape(v8::Local<v8::Object>());
|
||
|
}
|
||
|
return scope.Escape(obj->Clone());
|
||
|
#else
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(array->CloneElementAt(isolate->GetCurrentContext(), index)
|
||
|
.FromMaybe(v8::Local<v8::Object>()));
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
inline MaybeLocal<v8::Value> Call(
|
||
|
v8::Local<v8::Function> fun
|
||
|
, v8::Local<v8::Object> recv
|
||
|
, int argc
|
||
|
, v8::Local<v8::Value> argv[]) {
|
||
|
v8::Isolate *isolate = v8::Isolate::GetCurrent();
|
||
|
v8::EscapableHandleScope scope(isolate);
|
||
|
return scope.Escape(fun->Call(isolate->GetCurrentContext(), recv, argc, argv)
|
||
|
.FromMaybe(v8::Local<v8::Value>()));
|
||
|
}
|
||
|
|
||
|
#endif // NAN_MAYBE_43_INL_H_
|