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