22 #define NAPI_VERSION 1 26 uint32_t engine_error_code = 0,
27 void* engine_reserved =
nullptr);
51 #define ENV_OBJECT_TEMPLATE(env, prefix, destination, field_count) \ 53 if ((env)->prefix ## _template.IsEmpty()) { \ 54 (destination) = v8::ObjectTemplate::New(isolate); \ 55 (destination)->SetInternalFieldCount((field_count)); \ 56 (env)->prefix ## _template.Reset(isolate, (destination)); \ 58 (destination) = v8::Local<v8::ObjectTemplate>::New( \ 59 isolate, env->prefix ## _template); \ 64 #define RETURN_STATUS_IF_FALSE(env, condition, status) \ 67 return napi_set_last_error((env), (status)); \ 71 #define CHECK_ENV(env) \ 72 if ((env) == nullptr) { \ 73 return napi_invalid_arg; \ 76 #define CHECK_ARG(env, arg) \ 77 RETURN_STATUS_IF_FALSE((env), ((arg) != nullptr), napi_invalid_arg) 79 #define CHECK_MAYBE_EMPTY(env, maybe, status) \ 80 RETURN_STATUS_IF_FALSE((env), !((maybe).IsEmpty()), (status)) 82 #define CHECK_MAYBE_NOTHING(env, maybe, status) \ 83 RETURN_STATUS_IF_FALSE((env), !((maybe).IsNothing()), (status)) 86 #define NAPI_PREAMBLE(env) \ 88 RETURN_STATUS_IF_FALSE((env), (env)->last_exception.IsEmpty(), \ 89 napi_pending_exception); \ 90 napi_clear_last_error((env)); \ 91 v8impl::TryCatch try_catch((env)) 93 #define CHECK_TO_TYPE(env, type, context, result, src, status) \ 95 CHECK_ARG((env), (src)); \ 96 auto maybe = v8impl::V8LocalValueFromJsValue((src))->To##type((context)); \ 97 CHECK_MAYBE_EMPTY((env), maybe, (status)); \ 98 (result) = maybe.ToLocalChecked(); \ 101 #define CHECK_TO_FUNCTION(env, result, src) \ 103 CHECK_ARG((env), (src)); \ 104 v8::Local<v8::Value> v8value = v8impl::V8LocalValueFromJsValue((src)); \ 105 RETURN_STATUS_IF_FALSE((env), v8value->IsFunction(), napi_invalid_arg); \ 106 (result) = v8value.As<v8::Function>(); \ 109 #define CHECK_TO_OBJECT(env, context, result, src) \ 110 CHECK_TO_TYPE((env), Object, (context), (result), (src), napi_object_expected) 112 #define CHECK_TO_STRING(env, context, result, src) \ 113 CHECK_TO_TYPE((env), String, (context), (result), (src), napi_string_expected) 115 #define CHECK_TO_NUMBER(env, context, result, src) \ 116 CHECK_TO_TYPE((env), Number, (context), (result), (src), napi_number_expected) 118 #define CHECK_TO_BOOL(env, context, result, src) \ 119 CHECK_TO_TYPE((env), Boolean, (context), (result), (src), \ 120 napi_boolean_expected) 122 #define CHECK_NEW_FROM_UTF8_LEN(env, result, str, len) \ 124 auto str_maybe = v8::String::NewFromUtf8( \ 125 (env)->isolate, (str), v8::NewStringType::kInternalized, (len)); \ 126 CHECK_MAYBE_EMPTY((env), str_maybe, napi_generic_failure); \ 127 (result) = str_maybe.ToLocalChecked(); \ 130 #define CHECK_NEW_FROM_UTF8(env, result, str) \ 131 CHECK_NEW_FROM_UTF8_LEN((env), (result), (str), -1) 133 #define GET_RETURN_STATUS(env) \ 134 (!try_catch.HasCaught() ? napi_ok \ 135 : napi_set_last_error((env), napi_pending_exception)) 141 static inline v8::PropertyAttribute V8PropertyAttributesFromDescriptor(
143 unsigned int attribute_flags = v8::PropertyAttribute::None;
145 if (descriptor->
getter !=
nullptr || descriptor->
setter !=
nullptr) {
148 attribute_flags |= (descriptor->
setter ==
nullptr ?
149 v8::PropertyAttribute::ReadOnly : v8::PropertyAttribute::None);
151 attribute_flags |= v8::PropertyAttribute::ReadOnly;
155 attribute_flags |= v8::PropertyAttribute::DontEnum;
158 attribute_flags |= v8::PropertyAttribute::DontDelete;
161 return static_cast<v8::PropertyAttribute
>(attribute_flags);
164 class HandleScopeWrapper {
166 explicit HandleScopeWrapper(v8::Isolate*
isolate) : scope(isolate) {}
169 v8::HandleScope scope;
177 class EscapableHandleScopeWrapper {
179 explicit EscapableHandleScopeWrapper(v8::Isolate*
isolate)
180 : scope(isolate), escape_called_(
false) {}
181 bool escape_called()
const {
182 return escape_called_;
184 template <
typename T>
185 v8::Local<T> Escape(v8::Local<T> handle) {
186 escape_called_ =
true;
187 return scope.Escape(handle);
191 v8::EscapableHandleScope scope;
200 return reinterpret_cast<HandleScopeWrapper*
>(
s);
204 EscapableHandleScopeWrapper* s) {
208 EscapableHandleScopeWrapper*
209 V8EscapableHandleScopeFromJsEscapableHandleScope(
211 return reinterpret_cast<EscapableHandleScopeWrapper*
>(
s);
218 static_assert(
sizeof(v8::Local<v8::Value>) ==
sizeof(
napi_value),
219 "Cannot convert between v8::Local<v8::Value> and napi_value");
221 napi_deferred JsDeferredFromV8Persistent(v8::Persistent<v8::Value>* local) {
225 v8::Persistent<v8::Value>* V8PersistentFromJsDeferred(
napi_deferred local) {
226 return reinterpret_cast<v8::Persistent<v8::Value>*
>(local);
229 napi_value JsValueFromV8LocalValue(v8::Local<v8::Value> local) {
233 v8::Local<v8::Value> V8LocalValueFromJsValue(
napi_value v) {
234 v8::Local<v8::Value> local;
235 memcpy(&local, &v,
sizeof(v));
241 v8::Local<v8::Name>* result) {
245 v8::Local<v8::Value> property_value =
246 v8impl::V8LocalValueFromJsValue(p->
name);
249 *result = property_value.As<v8::Name>();
263 _finalize_callback(finalize_callback),
264 _finalize_data(finalize_data),
265 _finalize_hint(finalize_hint) {
274 void* finalize_data =
nullptr,
275 void* finalize_hint =
nullptr) {
276 return new Finalizer(
277 env, finalize_callback, finalize_data, finalize_hint);
280 static void Delete(Finalizer* finalizer) {
285 static void FinalizeBufferCallback(
char*
data,
void* hint) {
286 Finalizer* finalizer =
static_cast<Finalizer*
>(hint);
287 if (finalizer->_finalize_callback !=
nullptr) {
288 finalizer->_finalize_callback(
291 finalizer->_finalize_hint);
300 void* _finalize_data;
301 void* _finalize_hint;
305 class Reference :
private Finalizer {
308 v8::Local<v8::Value> value,
309 uint32_t initial_refcount,
314 : Finalizer(env, finalize_callback, finalize_data, finalize_hint),
315 _persistent(env->
isolate, value),
316 _refcount(initial_refcount),
317 _delete_self(delete_self) {
318 if (initial_refcount == 0) {
320 this, FinalizeCallback, v8::WeakCallbackType::kParameter);
321 _persistent.MarkIndependent();
337 v8::Local<v8::Value> value,
338 uint32_t initial_refcount,
341 void* finalize_data =
nullptr,
342 void* finalize_hint =
nullptr) {
343 return new Reference(env,
352 static void Delete(Reference* reference) {
357 if (++_refcount == 1) {
358 _persistent.ClearWeak();
365 if (_refcount == 0) {
368 if (--_refcount == 0) {
370 this, FinalizeCallback, v8::WeakCallbackType::kParameter);
371 _persistent.MarkIndependent();
377 uint32_t RefCount() {
381 v8::Local<v8::Value> Get() {
382 if (_persistent.IsEmpty()) {
383 return v8::Local<v8::Value>();
390 static void FinalizeCallback(
const v8::WeakCallbackInfo<Reference>&
data) {
391 Reference* reference = data.GetParameter();
392 reference->_persistent.Reset();
396 bool delete_self = reference->_delete_self;
398 if (reference->_finalize_callback !=
nullptr) {
399 reference->_finalize_callback(
401 reference->_finalize_data,
402 reference->_finalize_hint);
410 v8::Persistent<v8::Value> _persistent;
415 class TryCatch :
public v8::TryCatch {
418 : v8::TryCatch(env->
isolate), _env(env) {}
422 _env->last_exception.Reset(_env->isolate, Exception());
432 static const int kDataIndex = 0;
433 static const int kEnvIndex = 1;
435 static const int kFunctionIndex = 2;
436 static const int kFunctionFieldCount = 3;
438 static const int kGetterIndex = 2;
439 static const int kSetterIndex = 3;
440 static const int kAccessorFieldCount = 4;
444 class CallbackWrapper {
446 CallbackWrapper(
napi_value this_arg,
size_t args_length,
void*
data)
447 : _this(this_arg), _args_length(args_length), _data(data) {}
449 virtual bool IsConstructCall() = 0;
450 virtual void Args(
napi_value* buffer,
size_t bufferlength) = 0;
451 virtual void SetReturnValue(
napi_value value) = 0;
455 size_t ArgsLength() {
return _args_length; }
457 void*
Data() {
return _data; }
461 const size_t _args_length;
465 template <
typename Info,
int kInternalFieldIndex>
466 class CallbackWrapperBase :
public CallbackWrapper {
468 CallbackWrapperBase(
const Info& cbinfo,
const size_t args_length)
469 : CallbackWrapper(JsValueFromV8LocalValue(cbinfo.This()),
473 _cbdata(v8::Local<v8::Object>::Cast(cbinfo.Data())) {
474 _data = v8::Local<v8::External>::Cast(_cbdata->GetInternalField(kDataIndex))
479 bool IsConstructCall()
override {
return false; }
482 void InvokeCallback() {
484 static_cast<CallbackWrapper*
>(
this));
486 v8::Local<v8::External>::Cast(
487 _cbdata->GetInternalField(kInternalFieldIndex))->Value());
488 v8::Isolate*
isolate = _cbinfo.GetIsolate();
491 v8::Local<v8::External>::Cast(
492 _cbdata->GetInternalField(kEnvIndex))->Value());
495 napi_clear_last_error(env);
499 if (result !=
nullptr) {
500 this->SetReturnValue(result);
504 isolate->ThrowException(
511 const v8::Local<v8::Object> _cbdata;
514 class FunctionCallbackWrapper
515 :
public CallbackWrapperBase<v8::FunctionCallbackInfo<v8::Value>,
518 static void Invoke(
const v8::FunctionCallbackInfo<v8::Value>& info) {
519 FunctionCallbackWrapper cbwrapper(info);
520 cbwrapper.InvokeCallback();
523 explicit FunctionCallbackWrapper(
524 const v8::FunctionCallbackInfo<v8::Value>& cbinfo)
525 : CallbackWrapperBase(cbinfo, cbinfo.Length()) {}
528 bool IsConstructCall()
override {
return _cbinfo.IsConstructCall(); }
531 void Args(
napi_value* buffer,
size_t buffer_length)
override {
533 size_t min = std::min(buffer_length, _args_length);
535 for (; i < min; i += 1) {
536 buffer[i] = v8impl::JsValueFromV8LocalValue(_cbinfo[i]);
539 if (i < buffer_length) {
541 v8impl::JsValueFromV8LocalValue(v8::Undefined(_cbinfo.GetIsolate()));
542 for (; i < buffer_length; i += 1) {
543 buffer[i] = undefined;
549 void SetReturnValue(
napi_value value)
override {
550 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
551 _cbinfo.GetReturnValue().Set(val);
555 class GetterCallbackWrapper
556 :
public CallbackWrapperBase<v8::PropertyCallbackInfo<v8::Value>,
559 static void Invoke(v8::Local<v8::Name> property,
560 const v8::PropertyCallbackInfo<v8::Value>& info) {
561 GetterCallbackWrapper cbwrapper(info);
562 cbwrapper.InvokeCallback();
565 explicit GetterCallbackWrapper(
566 const v8::PropertyCallbackInfo<v8::Value>& cbinfo)
567 : CallbackWrapperBase(cbinfo, 0) {}
570 void Args(
napi_value* buffer,
size_t buffer_length)
override {
571 if (buffer_length > 0) {
573 v8impl::JsValueFromV8LocalValue(v8::Undefined(_cbinfo.GetIsolate()));
574 for (
size_t i = 0; i < buffer_length; i += 1) {
575 buffer[i] = undefined;
581 void SetReturnValue(
napi_value value)
override {
582 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
583 _cbinfo.GetReturnValue().Set(val);
587 class SetterCallbackWrapper
588 :
public CallbackWrapperBase<v8::PropertyCallbackInfo<void>, kSetterIndex> {
590 static void Invoke(v8::Local<v8::Name> property,
591 v8::Local<v8::Value> value,
592 const v8::PropertyCallbackInfo<void>& info) {
593 SetterCallbackWrapper cbwrapper(info, value);
594 cbwrapper.InvokeCallback();
597 SetterCallbackWrapper(
const v8::PropertyCallbackInfo<void>& cbinfo,
598 const v8::Local<v8::Value>& value)
599 : CallbackWrapperBase(cbinfo, 1), _value(value) {}
602 void Args(
napi_value* buffer,
size_t buffer_length)
override {
603 if (buffer_length > 0) {
604 buffer[0] = v8impl::JsValueFromV8LocalValue(_value);
606 if (buffer_length > 1) {
607 napi_value undefined = v8impl::JsValueFromV8LocalValue(
608 v8::Undefined(_cbinfo.GetIsolate()));
609 for (
size_t i = 1; i < buffer_length; i += 1) {
610 buffer[i] = undefined;
617 void SetReturnValue(
napi_value value)
override {
622 const v8::Local<v8::Value>& _value;
627 v8::Local<v8::Object> CreateFunctionCallbackData(
napi_env env,
631 v8::Local<v8::Context> context = isolate->GetCurrentContext();
633 v8::Local<v8::ObjectTemplate> otpl;
635 v8::Local<v8::Object> cbdata = otpl->NewInstance(context).ToLocalChecked();
637 cbdata->SetInternalField(
640 cbdata->SetInternalField(
641 v8impl::kFunctionIndex,
643 cbdata->SetInternalField(
652 v8::Local<v8::Object> CreateAccessorCallbackData(
napi_env env,
657 v8::Local<v8::Context> context = isolate->GetCurrentContext();
659 v8::Local<v8::ObjectTemplate> otpl;
661 v8::Local<v8::Object> cbdata = otpl->NewInstance(context).ToLocalChecked();
663 cbdata->SetInternalField(
667 if (getter !=
nullptr) {
668 cbdata->SetInternalField(
669 v8impl::kGetterIndex,
673 if (setter !=
nullptr) {
674 cbdata->SetInternalField(
675 v8impl::kSetterIndex,
679 cbdata->SetInternalField(
685 int kWrapperFields = 3;
689 const char napi_wrap_name[] =
"N-API Wrapper";
694 bool FindWrapper(v8::Local<v8::Object> obj,
695 v8::Local<v8::Object>* result =
nullptr,
696 v8::Local<v8::Object>* parent =
nullptr) {
697 v8::Local<v8::Object> wrapper = obj;
700 v8::Local<v8::Value> proto = wrapper->GetPrototype();
701 if (proto.IsEmpty() || !proto->IsObject()) {
704 if (parent !=
nullptr) {
707 wrapper = proto.As<v8::Object>();
708 if (wrapper->InternalFieldCount() == kWrapperFields) {
709 v8::Local<v8::Value> external = wrapper->GetInternalField(1);
710 if (external->IsExternal() &&
711 external.As<v8::External>()->Value() == v8impl::napi_wrap_name) {
717 if (result !=
nullptr) {
723 static void DeleteEnv(
napi_env env,
void* data,
void* hint) {
727 napi_env GetEnv(v8::Local<v8::Context> context) {
730 auto isolate = context->GetIsolate();
731 auto global = context->Global();
738 auto key = v8::Private::ForApi(
isolate,
739 v8::String::NewFromOneByte(
isolate,
740 reinterpret_cast<const uint8_t*>(
"N-API Environment"),
741 v8::NewStringType::kInternalized).ToLocalChecked());
742 auto value = global->GetPrivate(context, key).ToLocalChecked();
744 if (value->IsExternal()) {
745 result =
static_cast<napi_env>(value.As<v8::External>()->Value());
752 CHECK(global->SetPrivate(context, key, external).FromJust());
756 Reference::New(result, external, 0,
true, DeleteEnv,
nullptr,
nullptr);
765 v8::Local<v8::Object>* wrapper,
766 v8::Local<v8::Object>* parent =
nullptr) {
770 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(js_object);
772 v8::Local<v8::Object> obj = value.As<v8::Object>();
777 v8::Local<v8::Value> unwrappedValue = (*wrapper)->GetInternalField(0);
780 *result = unwrappedValue.As<v8::External>()->Value();
792 v8::Local<v8::Context> context = env->
isolate->GetCurrentContext();
793 v8::Persistent<v8::Value>* deferred_ref =
794 V8PersistentFromJsDeferred(deferred);
795 v8::Local<v8::Value> v8_deferred =
798 auto v8_resolver = v8::Local<v8::Promise::Resolver>::Cast(v8_deferred);
800 v8::Maybe<bool> success = is_resolved ?
801 v8_resolver->Resolve(context, v8impl::V8LocalValueFromJsValue(result)) :
802 v8_resolver->Reject(context, v8impl::V8LocalValueFromJsValue(result));
804 deferred_ref->Reset();
817 void napi_module_register_cb(v8::Local<v8::Object> exports,
818 v8::Local<v8::Value> module,
819 v8::Local<v8::Context> context,
825 napi_env env = v8impl::GetEnv(context);
829 v8impl::JsValueFromV8LocalValue(exports),
830 v8impl::JsValueFromV8LocalValue(module),
836 #ifndef EXTERNAL_NAPI 841 #endif // EXTERNAL_NAPI 848 #ifndef EXTERNAL_NAPI 854 #endif // EXTERNAL_NAPI 862 napi_module_register_cb,
872 "Invalid pointer passed as argument",
873 "An object was expected",
874 "A string was expected",
875 "A string or symbol was expected",
876 "A function was expected",
877 "A number was expected",
878 "A boolean was expected",
879 "An array was expected",
881 "An exception is pending",
882 "The async work item was cancelled",
883 "napi_escape_handle already called on scope"};
896 uint32_t engine_error_code,
897 void* engine_reserved) {
915 "Count of error messages must match count of error values");
928 const char* message) {
933 const char* utf8name,
942 v8::Local<v8::Function> return_value;
943 v8::EscapableHandleScope scope(isolate);
944 v8::Local<v8::Object> cbdata =
945 v8impl::CreateFunctionCallbackData(env, cb, callback_data);
950 isolate, v8impl::FunctionCallbackWrapper::Invoke, cbdata);
952 v8::Local<v8::Context> context = isolate->GetCurrentContext();
953 v8::MaybeLocal<v8::Function> maybe_function = tpl->GetFunction(context);
956 return_value = scope.Escape(maybe_function.ToLocalChecked());
958 if (utf8name !=
nullptr) {
959 v8::Local<v8::String> name_string;
961 return_value->SetName(name_string);
964 *result = v8impl::JsValueFromV8LocalValue(return_value);
970 const char* utf8name,
973 size_t property_count,
982 v8::EscapableHandleScope scope(isolate);
983 v8::Local<v8::Object> cbdata =
984 v8impl::CreateFunctionCallbackData(env, constructor, callback_data);
989 isolate, v8impl::FunctionCallbackWrapper::Invoke, cbdata);
991 v8::Local<v8::String> name_string;
993 tpl->SetClassName(name_string);
995 size_t static_property_count = 0;
996 for (
size_t i = 0; i < property_count; i++) {
1001 static_property_count++;
1005 v8::Local<v8::Name> property_name;
1007 v8impl::V8NameFromPropertyDescriptor(env, p, &property_name);
1010 return napi_set_last_error(env, status);
1013 v8::PropertyAttribute attributes =
1014 v8impl::V8PropertyAttributesFromDescriptor(p);
1019 v8::Local<v8::Object> cbdata = v8impl::CreateAccessorCallbackData(
1022 tpl->PrototypeTemplate()->SetAccessor(
1024 p->
getter ? v8impl::GetterCallbackWrapper::Invoke :
nullptr,
1025 p->
setter ? v8impl::SetterCallbackWrapper::Invoke :
nullptr,
1027 v8::AccessControl::DEFAULT,
1029 }
else if (p->
method !=
nullptr) {
1030 v8::Local<v8::Object> cbdata =
1031 v8impl::CreateFunctionCallbackData(env, p->
method, p->
data);
1035 v8::Local<v8::FunctionTemplate>
t =
1037 v8impl::FunctionCallbackWrapper::Invoke,
1041 tpl->PrototypeTemplate()->Set(property_name, t, attributes);
1043 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(p->
value);
1044 tpl->PrototypeTemplate()->Set(property_name, value, attributes);
1048 *result = v8impl::JsValueFromV8LocalValue(scope.Escape(tpl->GetFunction()));
1050 if (static_property_count > 0) {
1051 std::vector<napi_property_descriptor> static_descriptors;
1052 static_descriptors.reserve(static_property_count);
1054 for (
size_t i = 0; i < property_count; i++) {
1057 static_descriptors.push_back(*p);
1064 static_descriptors.size(),
1065 static_descriptors.data());
1079 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1080 v8::Local<v8::Object> obj;
1083 auto maybe_propertynames = obj->GetPropertyNames(context);
1087 *result = v8impl::JsValueFromV8LocalValue(
1088 maybe_propertynames.ToLocalChecked());
1101 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1102 v8::Local<v8::Object> obj;
1106 v8::Local<v8::Value> k = v8impl::V8LocalValueFromJsValue(key);
1107 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
1109 v8::Maybe<bool> set_maybe = obj->Set(context, k, val);
1124 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1125 v8::Local<v8::Object> obj;
1129 v8::Local<v8::Value> k = v8impl::V8LocalValueFromJsValue(key);
1130 v8::Maybe<bool> has_maybe = obj->Has(context, k);
1134 *result = has_maybe.FromMaybe(
false);
1147 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1148 v8::Local<v8::Value> k = v8impl::V8LocalValueFromJsValue(key);
1149 v8::Local<v8::Object> obj;
1153 auto get_maybe = obj->Get(context, k);
1157 v8::Local<v8::Value> val = get_maybe.ToLocalChecked();
1158 *result = v8impl::JsValueFromV8LocalValue(val);
1170 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1171 v8::Local<v8::Value> k = v8impl::V8LocalValueFromJsValue(key);
1172 v8::Local<v8::Object> obj;
1175 v8::Maybe<bool> delete_maybe = obj->Delete(context, k);
1179 *result = delete_maybe.FromMaybe(
false);
1192 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1193 v8::Local<v8::Object> obj;
1196 v8::Local<v8::Value> k = v8impl::V8LocalValueFromJsValue(key);
1198 v8::Maybe<bool> has_maybe = obj->HasOwnProperty(context, k.As<v8::Name>());
1200 *result = has_maybe.FromMaybe(
false);
1207 const char* utf8name,
1213 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1214 v8::Local<v8::Object> obj;
1218 v8::Local<v8::Name> key;
1221 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
1223 v8::Maybe<bool> set_maybe = obj->Set(context, key, val);
1231 const char* utf8name,
1237 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1238 v8::Local<v8::Object> obj;
1242 v8::Local<v8::Name> key;
1245 v8::Maybe<bool> has_maybe = obj->Has(context, key);
1249 *result = has_maybe.FromMaybe(
false);
1255 const char* utf8name,
1261 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1263 v8::Local<v8::Name> key;
1266 v8::Local<v8::Object> obj;
1270 auto get_maybe = obj->Get(context, key);
1274 v8::Local<v8::Value> val = get_maybe.ToLocalChecked();
1275 *result = v8impl::JsValueFromV8LocalValue(val);
1287 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1288 v8::Local<v8::Object> obj;
1292 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
1293 auto set_maybe = obj->Set(context, index, val);
1308 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1309 v8::Local<v8::Object> obj;
1313 v8::Maybe<bool> has_maybe = obj->Has(context, index);
1317 *result = has_maybe.FromMaybe(
false);
1329 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1330 v8::Local<v8::Object> obj;
1334 auto get_maybe = obj->Get(context, index);
1338 *result = v8impl::JsValueFromV8LocalValue(get_maybe.ToLocalChecked());
1349 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1350 v8::Local<v8::Object> obj;
1353 v8::Maybe<bool> delete_maybe = obj->Delete(context, index);
1357 *result = delete_maybe.FromMaybe(
false);
1364 size_t property_count,
1367 if (property_count > 0) {
1372 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1374 v8::Local<v8::Object> obj;
1377 for (
size_t i = 0; i < property_count; i++) {
1380 v8::Local<v8::Name> property_name;
1382 v8impl::V8NameFromPropertyDescriptor(env, p, &property_name);
1385 return napi_set_last_error(env, status);
1388 v8::PropertyAttribute attributes =
1389 v8impl::V8PropertyAttributesFromDescriptor(p);
1392 v8::Local<v8::Object> cbdata = v8impl::CreateAccessorCallbackData(
1398 auto set_maybe = obj->SetAccessor(
1401 p->
getter ? v8impl::GetterCallbackWrapper::Invoke :
nullptr,
1402 p->
setter ? v8impl::SetterCallbackWrapper::Invoke :
nullptr,
1404 v8::AccessControl::DEFAULT,
1407 if (!set_maybe.FromMaybe(
false)) {
1410 }
else if (p->
method !=
nullptr) {
1411 v8::Local<v8::Object> cbdata =
1412 v8impl::CreateFunctionCallbackData(env, p->
method, p->
data);
1417 isolate, v8impl::FunctionCallbackWrapper::Invoke, cbdata);
1419 auto define_maybe = obj->DefineOwnProperty(
1420 context, property_name, t->GetFunction(), attributes);
1422 if (!define_maybe.FromMaybe(
false)) {
1426 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(p->
value);
1429 obj->DefineOwnProperty(context, property_name, value, attributes);
1431 if (!define_maybe.FromMaybe(
false)) {
1445 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
1447 *result = val->IsArray();
1448 return napi_clear_last_error(env);
1458 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
1461 v8::Local<v8::Array> arr = val.As<v8::Array>();
1462 *result = arr->Length();
1476 v8::Local<v8::Value>
a = v8impl::V8LocalValueFromJsValue(lhs);
1477 v8::Local<v8::Value> b = v8impl::V8LocalValueFromJsValue(rhs);
1479 *result = a->StrictEquals(b);
1490 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1492 v8::Local<v8::Object> obj;
1495 v8::Local<v8::Value> val = obj->GetPrototype();
1496 *result = v8impl::JsValueFromV8LocalValue(val);
1504 *result = v8impl::JsValueFromV8LocalValue(
1507 return napi_clear_last_error(env);
1514 *result = v8impl::JsValueFromV8LocalValue(
1517 return napi_clear_last_error(env);
1526 *result = v8impl::JsValueFromV8LocalValue(
1529 return napi_clear_last_error(env);
1541 v8::String::NewFromOneByte(
isolate,
1542 reinterpret_cast<const uint8_t*>(str),
1543 v8::NewStringType::kInternalized,
1547 *result = v8impl::JsValueFromV8LocalValue(str_maybe.ToLocalChecked());
1548 return napi_clear_last_error(env);
1558 v8::Local<v8::String>
s;
1561 *result = v8impl::JsValueFromV8LocalValue(s);
1562 return napi_clear_last_error(env);
1574 v8::String::NewFromTwoByte(
isolate,
1575 reinterpret_cast<const uint16_t*>(str),
1576 v8::NewStringType::kInternalized,
1580 *result = v8impl::JsValueFromV8LocalValue(str_maybe.ToLocalChecked());
1581 return napi_clear_last_error(env);
1590 *result = v8impl::JsValueFromV8LocalValue(
1593 return napi_clear_last_error(env);
1602 *result = v8impl::JsValueFromV8LocalValue(
1605 return napi_clear_last_error(env);
1614 *result = v8impl::JsValueFromV8LocalValue(
1615 v8::Integer::NewFromUnsigned(env->
isolate, value));
1617 return napi_clear_last_error(env);
1626 *result = v8impl::JsValueFromV8LocalValue(
1629 return napi_clear_last_error(env);
1639 *result = v8impl::JsValueFromV8LocalValue(v8::True(isolate));
1641 *result = v8impl::JsValueFromV8LocalValue(v8::False(isolate));
1644 return napi_clear_last_error(env);
1655 if (description ==
nullptr) {
1658 v8::Local<v8::Value> desc = v8impl::V8LocalValueFromJsValue(description);
1661 *result = v8impl::JsValueFromV8LocalValue(
1665 return napi_clear_last_error(env);
1669 v8::Local<v8::Value> error,
1671 const char* code_cstring) {
1672 if ((code !=
nullptr) || (code_cstring !=
nullptr)) {
1674 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1675 v8::Local<v8::Object> err_object = error.As<v8::Object>();
1677 v8::Local<v8::Value> code_value = v8impl::V8LocalValueFromJsValue(code);
1678 if (code !=
nullptr) {
1679 code_value = v8impl::V8LocalValueFromJsValue(code);
1685 v8::Local<v8::Name> code_key;
1688 v8::Maybe<bool> set_maybe = err_object->Set(context, code_key, code_value);
1690 set_maybe.FromMaybe(
false),
1695 v8::Local<v8::String> name_string;
1697 v8::Local<v8::Name> name_key;
1700 auto maybe_name = err_object->Get(context, name_key);
1701 if (!maybe_name.IsEmpty()) {
1702 v8::Local<v8::Value> name = maybe_name.ToLocalChecked();
1703 if (name->IsString()) {
1704 name_string = v8::String::Concat(name_string, name.As<v8::String>());
1707 name_string = v8::String::Concat(name_string,
1708 FIXED_ONE_BYTE_STRING(isolate,
" ["));
1709 name_string = v8::String::Concat(name_string, code_value.As<v8::String>());
1710 name_string = v8::String::Concat(name_string,
1711 FIXED_ONE_BYTE_STRING(isolate,
"]"));
1713 set_maybe = err_object->Set(context, name_key, name_string);
1715 set_maybe.FromMaybe(
false),
1729 v8::Local<v8::Value> message_value = v8impl::V8LocalValueFromJsValue(msg);
1732 v8::Local<v8::Value> error_obj =
1733 v8::Exception::Error(message_value.As<v8::String>());
1737 *result = v8impl::JsValueFromV8LocalValue(error_obj);
1739 return napi_clear_last_error(env);
1750 v8::Local<v8::Value> message_value = v8impl::V8LocalValueFromJsValue(msg);
1753 v8::Local<v8::Value> error_obj =
1754 v8::Exception::TypeError(message_value.As<v8::String>());
1758 *result = v8impl::JsValueFromV8LocalValue(error_obj);
1760 return napi_clear_last_error(env);
1771 v8::Local<v8::Value> message_value = v8impl::V8LocalValueFromJsValue(msg);
1774 v8::Local<v8::Value> error_obj =
1775 v8::Exception::RangeError(message_value.As<v8::String>());
1779 *result = v8impl::JsValueFromV8LocalValue(error_obj);
1781 return napi_clear_last_error(env);
1793 v8::Local<v8::Value> v = v8impl::V8LocalValueFromJsValue(value);
1795 if (v->IsNumber()) {
1797 }
else if (v->IsString()) {
1799 }
else if (v->IsFunction()) {
1803 }
else if (v->IsExternal()) {
1807 }
else if (v->IsObject()) {
1809 }
else if (v->IsBoolean()) {
1811 }
else if (v->IsUndefined()) {
1813 }
else if (v->IsSymbol()) {
1815 }
else if (v->IsNull()) {
1822 return napi_clear_last_error(env);
1829 *result = v8impl::JsValueFromV8LocalValue(
1832 return napi_clear_last_error(env);
1839 *result = v8impl::JsValueFromV8LocalValue(
1842 return napi_clear_last_error(env);
1857 v8impl::CallbackWrapper* info =
1858 reinterpret_cast<v8impl::CallbackWrapper*
>(cbinfo);
1860 if (argv !=
nullptr) {
1862 info->Args(argv, *argc);
1864 if (argc !=
nullptr) {
1865 *argc = info->ArgsLength();
1867 if (this_arg !=
nullptr) {
1868 *this_arg = info->This();
1870 if (data !=
nullptr) {
1871 *data = info->Data();
1874 return napi_clear_last_error(env);
1885 v8impl::CallbackWrapper* info =
1886 reinterpret_cast<v8impl::CallbackWrapper*
>(cbinfo);
1888 *result = info->IsConstructCall();
1889 return napi_clear_last_error(env);
1905 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1907 v8::Local<v8::Value> v8recv = v8impl::V8LocalValueFromJsValue(recv);
1909 v8::Local<v8::Function> v8func;
1912 auto maybe = v8func->Call(context, v8recv, argc,
1913 reinterpret_cast<v8::Local<v8::Value>*
>(const_cast<napi_value*>(argv)));
1915 if (try_catch.HasCaught()) {
1918 if (result !=
nullptr) {
1920 *result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked());
1922 return napi_clear_last_error(env);
1934 v8::Local<v8::Context> context = isolate->GetCurrentContext();
1935 *result = v8impl::JsValueFromV8LocalValue(context->Global());
1937 return napi_clear_last_error(env);
1946 isolate->ThrowException(v8impl::V8LocalValueFromJsValue(error));
1949 return napi_clear_last_error(env);
1958 v8::Local<v8::String> str;
1961 v8::Local<v8::Value> error_obj = v8::Exception::Error(str);
1965 isolate->ThrowException(error_obj);
1968 return napi_clear_last_error(env);
1977 v8::Local<v8::String> str;
1980 v8::Local<v8::Value> error_obj = v8::Exception::TypeError(str);
1984 isolate->ThrowException(error_obj);
1987 return napi_clear_last_error(env);
1996 v8::Local<v8::String> str;
1999 v8::Local<v8::Value> error_obj = v8::Exception::RangeError(str);
2003 isolate->ThrowException(error_obj);
2006 return napi_clear_last_error(env);
2016 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2017 *result = val->IsNativeError();
2019 return napi_clear_last_error(env);
2031 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2034 *result = val.As<v8::Number>()->Value();
2036 return napi_clear_last_error(env);
2048 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2050 if (val->IsInt32()) {
2051 *result = val.As<v8::Int32>()->Value();
2056 v8::Local<v8::Context> context;
2057 *result = val->Int32Value(context).FromJust();
2060 return napi_clear_last_error(env);
2072 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2074 if (val->IsUint32()) {
2075 *result = val.As<v8::Uint32>()->Value();
2080 v8::Local<v8::Context> context;
2081 *result = val->Uint32Value(context).FromJust();
2084 return napi_clear_last_error(env);
2096 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2099 if (val->IsInt32()) {
2100 *result = val.As<v8::Int32>()->Value();
2101 return napi_clear_last_error(env);
2108 double doubleValue = val.As<v8::Number>()->Value();
2109 if (std::isnan(doubleValue)) {
2113 v8::Local<v8::Context> context;
2114 *result = val->IntegerValue(context).FromJust();
2117 return napi_clear_last_error(env);
2127 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2130 *result = val.As<v8::Boolean>()->Value();
2132 return napi_clear_last_error(env);
2151 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2156 *result = val.As<v8::String>()->
Length();
2158 int copied = val.As<v8::String>()->WriteOneByte(
2159 reinterpret_cast<uint8_t*>(buf), 0, bufsize - 1,
2160 v8::String::NO_NULL_TERMINATION);
2163 if (result !=
nullptr) {
2168 return napi_clear_last_error(env);
2187 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2192 *result = val.As<v8::String>()->Utf8Length();
2194 int copied = val.As<v8::String>()->WriteUtf8(
2195 buf, bufsize - 1,
nullptr, v8::String::REPLACE_INVALID_UTF8 |
2196 v8::String::NO_NULL_TERMINATION);
2199 if (result !=
nullptr) {
2204 return napi_clear_last_error(env);
2223 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2229 *result = val.As<v8::String>()->
Length();
2231 int copied = val.As<v8::String>()->Write(
2232 reinterpret_cast<uint16_t*>(buf), 0, bufsize - 1,
2233 v8::String::NO_NULL_TERMINATION);
2236 if (result !=
nullptr) {
2241 return napi_clear_last_error(env);
2252 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2253 v8::Local<v8::Object> obj;
2256 *result = v8impl::JsValueFromV8LocalValue(obj);
2268 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2269 v8::Local<v8::Boolean> b;
2273 *result = v8impl::JsValueFromV8LocalValue(b);
2285 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2286 v8::Local<v8::Number> num;
2290 *result = v8impl::JsValueFromV8LocalValue(num);
2302 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2303 v8::Local<v8::String> str;
2307 *result = v8impl::JsValueFromV8LocalValue(str);
2313 void* native_object,
2315 void* finalize_hint,
2321 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2323 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(js_object);
2325 v8::Local<v8::Object> obj = value.As<v8::Object>();
2332 v8::Local<v8::ObjectTemplate> wrapper_template;
2335 auto maybe_object = wrapper_template->NewInstance(context);
2337 v8::Local<v8::Object> wrapper = maybe_object.ToLocalChecked();
2342 reinterpret_cast<void*>(const_cast<char*>(v8impl::napi_wrap_name))));
2345 v8::Local<v8::Value> proto = obj->GetPrototype();
2346 CHECK(wrapper->SetPrototype(context, proto).FromJust());
2347 CHECK(obj->SetPrototype(context, wrapper).FromJust());
2349 v8impl::Reference* reference =
nullptr;
2350 if (result !=
nullptr) {
2357 env, obj, 0,
false, finalize_cb, native_object, finalize_hint);
2358 *result =
reinterpret_cast<napi_ref>(reference);
2359 }
else if (finalize_cb !=
nullptr) {
2362 env, obj, 0,
true, finalize_cb, native_object, finalize_hint);
2365 if (reference !=
nullptr) {
2376 v8::Local<v8::Object> wrapper;
2377 return napi_set_last_error(env, v8impl::Unwrap(env, obj, result, &wrapper));
2382 v8::Local<v8::Object> wrapper;
2383 v8::Local<v8::Object> parent;
2386 return napi_set_last_error(env, status);
2389 v8::Local<v8::Value> external = wrapper->GetInternalField(2);
2390 if (external->IsExternal()) {
2391 v8impl::Reference::Delete(
2392 static_cast<v8impl::Reference*>(external.As<v8::External>()->Value()));
2395 if (!parent.IsEmpty()) {
2396 v8::Maybe<bool> maybe = parent->SetPrototype(
2397 env->
isolate->GetCurrentContext(), wrapper->GetPrototype());
2399 if (!maybe.FromMaybe(
false)) {
2410 void* finalize_hint,
2429 *result = v8impl::JsValueFromV8LocalValue(external_value);
2431 return napi_clear_last_error(env);
2441 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2444 v8::Local<v8::External> external_value = val.As<v8::External>();
2445 *result = external_value->Value();
2447 return napi_clear_last_error(env);
2453 uint32_t initial_refcount,
2462 env, v8impl::V8LocalValueFromJsValue(value), initial_refcount,
false);
2464 *result =
reinterpret_cast<napi_ref>(reference);
2465 return napi_clear_last_error(env);
2476 v8impl::Reference::Delete(reinterpret_cast<v8impl::Reference*>(ref));
2478 return napi_clear_last_error(env);
2492 v8impl::Reference* reference =
reinterpret_cast<v8impl::Reference*
>(ref);
2493 uint32_t count = reference->Ref();
2495 if (result !=
nullptr) {
2499 return napi_clear_last_error(env);
2512 v8impl::Reference* reference =
reinterpret_cast<v8impl::Reference*
>(ref);
2514 if (reference->RefCount() == 0) {
2518 uint32_t count = reference->Unref();
2520 if (result !=
nullptr) {
2524 return napi_clear_last_error(env);
2539 v8impl::Reference* reference =
reinterpret_cast<v8impl::Reference*
>(ref);
2540 *result = v8impl::JsValueFromV8LocalValue(reference->Get());
2542 return napi_clear_last_error(env);
2551 *result = v8impl::JsHandleScopeFromV8HandleScope(
2552 new v8impl::HandleScopeWrapper(env->
isolate));
2553 return napi_clear_last_error(env);
2562 delete v8impl::V8HandleScopeFromJsHandleScope(scope);
2563 return napi_clear_last_error(env);
2574 *result = v8impl::JsEscapableHandleScopeFromV8EscapableHandleScope(
2575 new v8impl::EscapableHandleScopeWrapper(env->
isolate));
2576 return napi_clear_last_error(env);
2587 delete v8impl::V8EscapableHandleScopeFromJsEscapableHandleScope(scope);
2588 return napi_clear_last_error(env);
2602 v8impl::EscapableHandleScopeWrapper*
s =
2603 v8impl::V8EscapableHandleScopeFromJsEscapableHandleScope(scope);
2604 if (!s->escape_called()) {
2605 *result = v8impl::JsValueFromV8LocalValue(
2606 s->Escape(v8impl::V8LocalValueFromJsValue(escapee)));
2607 return napi_clear_last_error(env);
2625 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2627 v8::Local<v8::Function> ctor;
2630 auto maybe = ctor->NewInstance(context, argc,
2631 reinterpret_cast<v8::Local<v8::Value>*
>(const_cast<napi_value*>(argv)));
2635 *result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked());
2649 v8::Local<v8::Object> ctor;
2651 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2655 if (!ctor->IsFunction()) {
2657 "ERR_NAPI_CONS_FUNCTION",
2658 "Constructor must be a function");
2687 v8impl::V8LocalValueFromJsValue(value));
2718 v8::Local<v8::String> prototype_string;
2721 auto maybe_prototype = ctor->Get(context, prototype_string);
2724 v8::Local<v8::Value> prototype_property = maybe_prototype.ToLocalChecked();
2725 if (!prototype_property->IsObject()) {
2728 "ERR_NAPI_CONS_PROTOTYPE_OBJECT",
2729 "Constructor.prototype must be an object");
2734 auto maybe_ctor = prototype_property->ToObject(context);
2736 ctor = maybe_ctor.ToLocalChecked();
2738 v8::Local<v8::Value> current_obj = v8impl::V8LocalValueFromJsValue(
object);
2739 if (!current_obj->StrictEquals(ctor)) {
2740 for (v8::Local<v8::Value> original_obj = current_obj;
2741 !(current_obj->IsNull() || current_obj->IsUndefined());) {
2742 if (current_obj->StrictEquals(ctor)) {
2743 *result = !(original_obj->IsNumber() ||
2744 original_obj->IsBoolean() ||
2745 original_obj->IsString());
2748 v8::Local<v8::Object> obj;
2751 current_obj = obj->GetPrototype();
2771 v8::Local<v8::Context> context = isolate->GetCurrentContext();
2773 v8::Local<v8::Object> v8recv;
2776 v8::Local<v8::Function> v8func;
2780 isolate, v8recv, v8func, argc,
2781 reinterpret_cast<v8::Local<v8::Value>*
>(const_cast<napi_value*>(argv)));
2783 if (result !=
nullptr) {
2784 *result = v8impl::JsValueFromV8LocalValue(callback_result);
2798 return napi_clear_last_error(env);
2811 *result = v8impl::JsValueFromV8LocalValue(
2816 return napi_clear_last_error(env);
2830 v8::Local<v8::Object> buffer = maybe.ToLocalChecked();
2832 *result = v8impl::JsValueFromV8LocalValue(buffer);
2834 if (data !=
nullptr) {
2845 void* finalize_hint,
2854 env, finalize_cb,
nullptr, finalize_hint);
2857 static_cast<char*>(data),
2859 v8impl::Finalizer::FinalizeBufferCallback,
2864 *result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked());
2881 static_cast<const char*>(data), length);
2885 v8::Local<v8::Object> buffer = maybe.ToLocalChecked();
2886 *result = v8impl::JsValueFromV8LocalValue(buffer);
2888 if (result_data !=
nullptr) {
2901 return napi_clear_last_error(env);
2911 v8::Local<v8::Value> buffer = v8impl::V8LocalValueFromJsValue(value);
2913 if (data !=
nullptr) {
2916 if (length !=
nullptr) {
2920 return napi_clear_last_error(env);
2928 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
2929 *result = val->IsArrayBuffer();
2931 return napi_clear_last_error(env);
2942 v8::Local<v8::ArrayBuffer> buffer =
2947 if (data !=
nullptr) {
2948 *data = buffer->GetContents().Data();
2951 *result = v8impl::JsValueFromV8LocalValue(buffer);
2956 void* external_data,
2959 void* finalize_hint,
2965 v8::Local<v8::ArrayBuffer> buffer =
2968 if (finalize_cb !=
nullptr) {
2980 *result = v8impl::JsValueFromV8LocalValue(buffer);
2987 size_t* byte_length) {
2991 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer);
2994 v8::ArrayBuffer::Contents contents =
2995 value.As<v8::ArrayBuffer>()->GetContents();
2997 if (data !=
nullptr) {
2998 *data = contents.Data();
3001 if (byte_length !=
nullptr) {
3002 *byte_length = contents.ByteLength();
3005 return napi_clear_last_error(env);
3013 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
3014 *result = val->IsTypedArray();
3016 return napi_clear_last_error(env);
3029 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer);
3032 v8::Local<v8::ArrayBuffer> buffer = value.As<v8::ArrayBuffer>();
3033 v8::Local<v8::TypedArray> typedArray;
3067 *result = v8impl::JsValueFromV8LocalValue(typedArray);
3077 size_t* byte_offset) {
3081 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(typedarray);
3084 v8::Local<v8::TypedArray> array = value.As<v8::TypedArray>();
3086 if (type !=
nullptr) {
3087 if (value->IsInt8Array()) {
3089 }
else if (value->IsUint8Array()) {
3091 }
else if (value->IsUint8ClampedArray()) {
3093 }
else if (value->IsInt16Array()) {
3095 }
else if (value->IsUint16Array()) {
3097 }
else if (value->IsInt32Array()) {
3099 }
else if (value->IsUint32Array()) {
3101 }
else if (value->IsFloat32Array()) {
3103 }
else if (value->IsFloat64Array()) {
3108 if (length !=
nullptr) {
3109 *length = array->Length();
3112 v8::Local<v8::ArrayBuffer> buffer = array->Buffer();
3113 if (data !=
nullptr) {
3114 *data =
static_cast<uint8_t*
>(buffer->GetContents().Data()) +
3115 array->ByteOffset();
3118 if (arraybuffer !=
nullptr) {
3119 *arraybuffer = v8impl::JsValueFromV8LocalValue(buffer);
3122 if (byte_offset !=
nullptr) {
3123 *byte_offset = array->ByteOffset();
3126 return napi_clear_last_error(env);
3138 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(arraybuffer);
3141 v8::Local<v8::ArrayBuffer> buffer = value.As<v8::ArrayBuffer>();
3145 *result = v8impl::JsValueFromV8LocalValue(DataView);
3154 v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue(value);
3155 *result = val->IsDataView();
3157 return napi_clear_last_error(env);
3162 size_t* byte_length,
3165 size_t* byte_offset) {
3169 v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue(dataview);
3172 v8::Local<v8::DataView> array = value.As<v8::DataView>();
3174 if (byte_length !=
nullptr) {
3175 *byte_length = array->ByteLength();
3178 v8::Local<v8::ArrayBuffer> buffer = array->Buffer();
3179 if (data !=
nullptr) {
3180 *data =
static_cast<uint8_t*
>(buffer->GetContents().Data()) +
3181 array->ByteOffset();
3184 if (arraybuffer !=
nullptr) {
3185 *arraybuffer = v8impl::JsValueFromV8LocalValue(buffer);
3188 if (byte_offset !=
nullptr) {
3189 *byte_offset = array->ByteOffset();
3192 return napi_clear_last_error(env);
3199 return napi_clear_last_error(env);
3213 return napi_clear_last_error(env);
3217 int64_t change_in_bytes,
3218 int64_t* adjusted_value) {
3223 *adjusted_value = env->
isolate->AdjustAmountOfExternalAllocatedMemory(
3226 return napi_clear_last_error(env);
3250 void*
data =
nullptr)
3254 _complete(complete) {
3255 memset(&_request, 0,
sizeof(_request));
3256 _request.data =
this;
3266 return new Work(env, execute, complete, data);
3274 Work* work =
static_cast<Work*
>(req->data);
3275 work->_execute(work->_env, work->_data);
3279 Work* work =
static_cast<Work*
>(req->data);
3281 if (work->_complete !=
nullptr) {
3286 v8::HandleScope scope(env->
isolate);
3288 work->_complete(env, ConvertUVErrorCode(status), work->_data);
3297 v8::TryCatch try_catch(env->
isolate);
3319 #define CALL_UV(env, condition) \ 3321 int result = (condition); \ 3322 napi_status status = uvimpl::ConvertUVErrorCode(result); \ 3323 if (status != napi_ok) { \ 3324 return napi_set_last_error(env, status, result); \ 3341 return napi_clear_last_error(env);
3350 return napi_clear_last_error(env);
3361 uv_loop_t* event_loop = uv_default_loop();
3365 CALL_UV(env, uv_queue_work(event_loop,
3370 return napi_clear_last_error(env);
3379 CALL_UV(env, uv_cancel(reinterpret_cast<uv_req_t*>(w->
Request())));
3381 return napi_clear_last_error(env);
3394 auto v8_resolver = maybe.ToLocalChecked();
3395 auto v8_deferred =
new v8::Persistent<v8::Value>();
3396 v8_deferred->Reset(env->
isolate, v8_resolver);
3398 *deferred = v8impl::JsDeferredFromV8Persistent(v8_deferred);
3399 *promise = v8impl::JsValueFromV8LocalValue(v8_resolver->GetPromise());
3406 return v8impl::ConcludeDeferred(env, deferred, resolution,
true);
3412 return v8impl::ConcludeDeferred(env, deferred, resolution,
false);
3422 *is_promise = v8impl::V8LocalValueFromJsValue(promise)->IsPromise();
3424 return napi_clear_last_error(env);
3434 v8::Local<v8::Value> v8_script = v8impl::V8LocalValueFromJsValue(script);
3436 if (!v8_script->IsString()) {
3440 v8::Local<v8::Context> context = env->
isolate->GetCurrentContext();
3442 auto maybe_script = v8::Script::Compile(context,
3443 v8::Local<v8::String>::Cast(v8_script));
3446 auto script_result =
3447 maybe_script.ToLocalChecked()->Run(context);
3450 *result = v8impl::JsValueFromV8LocalValue(script_result.ToLocalChecked());
static Work * New(napi_env env, napi_async_execute_callback execute, napi_async_complete_callback complete, void *data)
struct napi_ref__ * napi_ref
napi_status napi_delete_reference(napi_env env, napi_ref ref)
napi_status napi_get_array_length(napi_env env, napi_value value, uint32_t *result)
napi_status napi_get_value_double(napi_env env, napi_value value, double *result)
napi_status napi_create_object(napi_env env, napi_value *result)
napi_status napi_set_named_property(napi_env env, napi_value object, const char *utf8name, napi_value value)
napi_status napi_has_element(napi_env env, napi_value object, uint32_t index, bool *result)
#define CHECK_NEW_FROM_UTF8_LEN(env, result, str, len)
napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope)
napi_status napi_throw(napi_env env, napi_value error)
napi_status napi_create_buffer(napi_env env, size_t length, void **data, napi_value *result)
napi_property_attributes attributes
napi_status napi_open_escapable_handle_scope(napi_env env, napi_escapable_handle_scope *result)
napi_status napi_create_int64(napi_env env, int64_t value, napi_value *result)
napi_status napi_define_class(napi_env env, const char *utf8name, napi_callback constructor, void *callback_data, size_t property_count, const napi_property_descriptor *properties, napi_value *result)
#define CHECK_MAYBE_EMPTY(env, maybe, status)
bool HasInstance(Local< Value > val)
napi_status napi_delete_property(napi_env env, napi_value object, napi_value key, bool *result)
struct napi_deferred__ * napi_deferred
napi_status napi_throw_error(napi_env env, const char *code, const char *msg)
napi_status napi_create_buffer_copy(napi_env env, size_t length, const void *data, void **result_data, napi_value *result)
v8::Persistent< v8::ObjectTemplate > accessor_data_template
NAPI_EXTERN napi_status napi_run_script(napi_env env, napi_value script, napi_value *result)
napi_status napi_get_value_bool(napi_env env, napi_value value, bool *result)
napi_status napi_create_int32(napi_env env, int32_t value, napi_value *result)
napi_status napi_coerce_to_string(napi_env env, napi_value value, napi_value *result)
napi_status napi_coerce_to_bool(napi_env env, napi_value value, napi_value *result)
napi_status napi_get_typedarray_info(napi_env env, napi_value typedarray, napi_typedarray_type *type, size_t *length, void **data, napi_value *arraybuffer, size_t *byte_offset)
#define NODE_MINOR_VERSION
#define CHECK_TO_STRING(env, context, result, src)
napi_status napi_strict_equals(napi_env env, napi_value lhs, napi_value rhs, bool *result)
napi_status napi_is_error(napi_env env, napi_value value, bool *result)
napi_status napi_is_typedarray(napi_env env, napi_value value, bool *result)
#define NODE_MODULE_VERSION
NAPI_EXTERN napi_status napi_is_promise(napi_env env, napi_value promise, bool *is_promise)
#define CHECK_TO_OBJECT(env, context, result, src)
napi_status napi_is_dataview(napi_env env, napi_value value, bool *result)
void FatalException(Isolate *isolate, Local< Value > error, Local< Message > message)
napi_status napi_create_reference(napi_env env, napi_value value, uint32_t initial_refcount, napi_ref *result)
napi_status napi_is_exception_pending(napi_env env, bool *result)
napi_status napi_get_null(napi_env env, napi_value *result)
struct napi_async_work__ * napi_async_work
napi_status napi_adjust_external_memory(napi_env env, int64_t change_in_bytes, int64_t *adjusted_value)
const char * error_message
napi_status napi_new_instance(napi_env env, napi_value constructor, size_t argc, const napi_value *argv, napi_value *result)
void node_module_register(void *m)
napi_status napi_delete_element(napi_env env, napi_value object, uint32_t index, bool *result)
napi_status napi_is_arraybuffer(napi_env env, napi_value value, bool *result)
napi_status napi_wrap(napi_env env, napi_value js_object, void *native_object, napi_finalize finalize_cb, void *finalize_hint, napi_ref *result)
static void Delete(Work *work)
napi_status napi_create_string_utf16(napi_env env, const char16_t *str, size_t length, napi_value *result)
NO_RETURN void FatalError(const char *location, const char *message)
napi_status napi_unwrap(napi_env env, napi_value obj, void **result)
union node::cares_wrap::@8::CaresAsyncData::@0 data
napi_status napi_has_property(napi_env env, napi_value object, napi_value key, bool *result)
struct napi_handle_scope__ * napi_handle_scope
struct napi_value__ * napi_value
napi_status napi_get_value_int64(napi_env env, napi_value value, int64_t *result)
napi_status napi_create_external_buffer(napi_env env, size_t length, void *data, napi_finalize finalize_cb, void *finalize_hint, napi_value *result)
napi_status napi_get_reference_value(napi_env env, napi_ref ref, napi_value *result)
void(* napi_finalize)(napi_env env, void *finalize_data, void *finalize_hint)
napi_status napi_escape_handle(napi_env env, napi_escapable_handle_scope scope, napi_value escapee, napi_value *result)
napi_status napi_create_external(napi_env env, void *data, napi_finalize finalize_cb, void *finalize_hint, napi_value *result)
napi_status napi_is_construct_call(napi_env env, napi_callback_info cbinfo, bool *result)
napi_status napi_get_cb_info(napi_env env, napi_callback_info cbinfo, size_t *argc, napi_value *argv, napi_value *this_arg, void **data)
void(* napi_async_execute_callback)(napi_env env, void *data)
napi_status napi_create_array_with_length(napi_env env, size_t length, napi_value *result)
napi_status napi_create_dataview(napi_env env, size_t byte_length, napi_value arraybuffer, size_t byte_offset, napi_value *result)
v8::Persistent< v8::ObjectTemplate > function_data_template
napi_status napi_delete_async_work(napi_env env, napi_async_work work)
napi_status napi_create_typedarray(napi_env env, napi_typedarray_type type, size_t length, napi_value arraybuffer, size_t byte_offset, napi_value *result)
const char * error_messages[]
napi_status napi_cancel_async_work(napi_env env, napi_async_work work)
napi_status napi_define_properties(napi_env env, napi_value object, size_t property_count, const napi_property_descriptor *properties)
napi_status napi_get_global(napi_env env, napi_value *result)
#define ENV_OBJECT_TEMPLATE(env, prefix, destination, field_count)
napi_status napi_create_array(napi_env env, napi_value *result)
#define NODE_PATCH_VERSION
NAPI_EXTERN napi_status napi_has_own_property(napi_env env, napi_value object, napi_value key, bool *result)
napi_status napi_get_value_string_utf8(napi_env env, napi_value value, char *buf, size_t bufsize, size_t *result)
napi_status napi_remove_wrap(napi_env env, napi_value obj, void **result)
napi_status napi_get_dataview_info(napi_env env, napi_value dataview, size_t *byte_length, void **data, napi_value *arraybuffer, size_t *byte_offset)
napi_status napi_get_value_string_utf16(napi_env env, napi_value value, char16_t *buf, size_t bufsize, size_t *result)
size_t Length(Local< Value > val)
napi_status napi_get_property(napi_env env, napi_value object, napi_value key, napi_value *result)
#define CHECK_TO_BOOL(env, context, result, src)
napi_addon_register_func nm_register_func
napi_status napi_coerce_to_object(napi_env env, napi_value value, napi_value *result)
napi_status napi_get_named_property(napi_env env, napi_value object, const char *utf8name, napi_value *result)
napi_status napi_create_string_latin1(napi_env env, const char *str, size_t length, napi_value *result)
napi_status napi_get_value_string_latin1(napi_env env, napi_value value, char *buf, size_t bufsize, size_t *result)
struct napi_callback_info__ * napi_callback_info
napi_status napi_make_callback(napi_env env, napi_value recv, napi_value func, size_t argc, const napi_value *argv, napi_value *result)
napi_status napi_call_function(napi_env env, napi_value recv, napi_value func, size_t argc, const napi_value *argv, napi_value *result)
napi_status napi_get_arraybuffer_info(napi_env env, napi_value arraybuffer, void **data, size_t *byte_length)
static void CompleteCallback(uv_work_t *req, int status)
napi_status napi_get_property_names(napi_env env, napi_value object, napi_value *result)
v8::Persistent< v8::Value > has_instance
napi_status napi_get_and_clear_last_exception(napi_env env, napi_value *result)
napi_status napi_create_uint32(napi_env env, uint32_t value, napi_value *result)
napi_status napi_is_buffer(napi_env env, napi_value value, bool *result)
#define CALL_UV(env, condition)
char * Data(Local< Value > val)
napi_status napi_has_named_property(napi_env env, napi_value object, const char *utf8name, bool *result)
napi_status napi_create_symbol(napi_env env, napi_value description, napi_value *result)
uint32_t engine_error_code
napi_status napi_create_error(napi_env env, napi_value code, napi_value msg, napi_value *result)
#define GET_RETURN_STATUS(env)
napi_status napi_get_undefined(napi_env env, napi_value *result)
napi_status napi_get_value_uint32(napi_env env, napi_value value, uint32_t *result)
#define NODE_MAJOR_VERSION
NAPI_EXTERN napi_status napi_reject_deferred(napi_env env, napi_deferred deferred, napi_value resolution)
struct napi_escapable_handle_scope__ * napi_escapable_handle_scope
napi_status napi_typeof(napi_env env, napi_value value, napi_valuetype *result)
napi_status napi_create_function(napi_env env, const char *utf8name, napi_callback cb, void *callback_data, napi_value *result)
napi_status napi_queue_async_work(napi_env env, napi_async_work work)
napi_status napi_coerce_to_number(napi_env env, napi_value value, napi_value *result)
napi_status napi_set_element(napi_env env, napi_value object, uint32_t index, napi_value value)
napi_status napi_get_boolean(napi_env env, bool value, napi_value *result)
napi_status napi_throw_range_error(napi_env env, const char *code, const char *msg)
#define CHECK_TO_FUNCTION(env, result, src)
napi_status napi_create_range_error(napi_env env, napi_value code, napi_value msg, napi_value *result)
static void ExecuteCallback(uv_work_t *req)
MaybeLocal< Object > New(Isolate *isolate, Local< String > string, enum encoding enc)
napi_status napi_set_property(napi_env env, napi_value object, napi_value key, napi_value value)
NAPI_NO_RETURN void napi_fatal_error(const char *location, const char *message)
napi_status napi_close_escapable_handle_scope(napi_env env, napi_escapable_handle_scope scope)
void(* napi_async_complete_callback)(napi_env env, napi_status status, void *data)
#define CHECK_MAYBE_NOTHING(env, maybe, status)
#define NAPI_PREAMBLE(env)
napi_status napi_get_prototype(napi_env env, napi_value object, napi_value *result)
napi_status napi_get_node_version(napi_env env, const napi_node_version **result)
MaybeLocal< Value > MakeCallback(Isolate *isolate, Local< Object > recv, Local< Function > callback, int argc, Local< Value > *argv, async_id asyncId, async_id triggerAsyncId)
v8::Persistent< v8::Value > last_exception
napi_status napi_get_buffer_info(napi_env env, napi_value value, void **data, size_t *length)
napi_status napi_create_double(napi_env env, double value, napi_value *result)
napi_env__(v8::Isolate *_isolate)
napi_status napi_open_handle_scope(napi_env env, napi_handle_scope *result)
napi_status napi_is_array(napi_env env, napi_value value, bool *result)
napi_value(* napi_callback)(napi_env env, napi_callback_info info)
napi_status napi_create_external_arraybuffer(napi_env env, void *external_data, size_t byte_length, napi_finalize finalize_cb, void *finalize_hint, napi_value *result)
napi_status napi_create_type_error(napi_env env, napi_value code, napi_value msg, napi_value *result)
#define RETURN_STATUS_IF_FALSE(env, condition, status)
#define CHECK_NEW_FROM_UTF8(env, result, str)
void napi_module_register(napi_module *mod)
#define CHECK_ARG(env, arg)
napi_status napi_create_arraybuffer(napi_env env, size_t byte_length, void **data, napi_value *result)
napi_status napi_create_async_work(napi_env env, napi_async_execute_callback execute, napi_async_complete_callback complete, void *data, napi_async_work *result)
napi_status napi_reference_unref(napi_env env, napi_ref ref, uint32_t *result)
napi_status napi_get_element(napi_env env, napi_value object, uint32_t index, napi_value *result)
napi_status napi_get_value_int32(napi_env env, napi_value value, int32_t *result)
NAPI_EXTERN napi_status napi_resolve_deferred(napi_env env, napi_deferred deferred, napi_value resolution)
napi_status napi_reference_ref(napi_env env, napi_ref ref, uint32_t *result)
NAPI_EXTERN napi_status napi_create_promise(napi_env env, napi_deferred *deferred, napi_value *promise)
v8::Persistent< v8::ObjectTemplate > wrap_template
napi_status napi_get_value_external(napi_env env, napi_value value, void **result)
napi_status napi_get_last_error_info(napi_env env, const napi_extended_error_info **result)
napi_status napi_instanceof(napi_env env, napi_value object, napi_value constructor, bool *result)
napi_extended_error_info last_error
MaybeLocal< Object > Copy(Isolate *isolate, const char *data, size_t length)
napi_status napi_get_version(napi_env env, uint32_t *result)
#define CHECK_TO_NUMBER(env, context, result, src)
napi_status napi_create_string_utf8(napi_env env, const char *str, size_t length, napi_value *result)
bool has_instance_available
napi_status napi_throw_type_error(napi_env env, const char *code, const char *msg)