| /********************************************************************* |
| * 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_ |