@@ -74,41 +74,19 @@ V8EscapableHandleScopeFromJsEscapableHandleScope(
7474
7575// === Conversion between V8 Handles and napi_value ========================
7676
77- // This is assuming v8::Local<> will always be implemented with a single
78- // pointer field so that we can pass it around as a void* (maybe we should
79- // use intptr_t instead of void*)
77+ // This asserts v8::Local<> will always be implemented with a single
78+ // pointer field so that we can pass it around as a void*.
79+ static_assert (sizeof (v8::Local<v8::Value>) == sizeof (napi_value),
80+ " Cannot convert between v8::Local<v8::Value> and napi_value" );
8081
8182napi_value JsValueFromV8LocalValue (v8::Local<v8::Value> local) {
82- // This is awkward, better way? memcpy but don't want that dependency?
83- union U {
84- napi_value v;
85- v8::Local<v8::Value> l;
86- U (v8::Local<v8::Value> _l) : l (_l) {}
87- } u (local);
88- assert (sizeof (u.v ) == sizeof (u.l ));
89- return u.v ;
83+ return reinterpret_cast <napi_value>(*local);
9084}
9185
9286v8::Local<v8::Value> V8LocalValueFromJsValue (napi_value v) {
93- // Likewise awkward
94- union U {
95- napi_value v;
96- v8::Local<v8::Value> l;
97- U (napi_value _v) : v (_v) {}
98- } u (v);
99- assert (sizeof (u.v ) == sizeof (u.l ));
100- return u.l ;
101- }
102-
103- static v8::Local<v8::Function> V8LocalFunctionFromJsValue (napi_value v) {
104- // Likewise awkward
105- union U {
106- napi_value v;
107- v8::Local<v8::Function> f;
108- U (napi_value _v) : v (_v) {}
109- } u (v);
110- assert (sizeof (u.v ) == sizeof (u.f ));
111- return u.f ;
87+ v8::Local<v8::Value> local;
88+ memcpy (&local, &v, sizeof (v));
89+ return local;
11290}
11391
11492// Wrapper around v8::Persistent that implements reference counting.
@@ -275,10 +253,10 @@ class CallbackWrapper {
275253 void * _data;
276254};
277255
278- template <typename T , int I >
256+ template <typename Info , int InternalFieldIndex >
279257class CallbackWrapperBase : public CallbackWrapper {
280258 public:
281- CallbackWrapperBase (const T & cbinfo, const size_t args_length)
259+ CallbackWrapperBase (const Info & cbinfo, const size_t args_length)
282260 : CallbackWrapper(JsValueFromV8LocalValue(cbinfo.This()),
283261 args_length,
284262 nullptr ),
@@ -301,7 +279,8 @@ class CallbackWrapperBase : public CallbackWrapper {
301279 napi_callback_info cbinfo_wrapper = reinterpret_cast <napi_callback_info>(
302280 static_cast <CallbackWrapper*>(this ));
303281 napi_callback cb = reinterpret_cast <napi_callback>(
304- v8::Local<v8::External>::Cast (_cbdata->GetInternalField (I))->Value ());
282+ v8::Local<v8::External>::Cast (
283+ _cbdata->GetInternalField (InternalFieldIndex))->Value ());
305284 v8::Isolate* isolate = _cbinfo.GetIsolate ();
306285 cb (v8impl::JsEnvFromV8Isolate (isolate), cbinfo_wrapper);
307286
@@ -312,7 +291,7 @@ class CallbackWrapperBase : public CallbackWrapper {
312291 }
313292 }
314293
315- const T & _cbinfo;
294+ const Info & _cbinfo;
316295 const v8::Local<v8::Object> _cbdata;
317296};
318297
@@ -420,8 +399,8 @@ class SetterCallbackWrapper
420399
421400 /* virtual*/
422401 void SetReturnValue (napi_value value) override {
423- // Cannot set the return value of a setter.
424- assert ( false );
402+ node::FatalError ( " napi_set_return_value " ,
403+ " Cannot return a value from a setter callback. " );
425404 }
426405
427406 private:
@@ -597,7 +576,7 @@ void napi_module_register(napi_module* mod) {
597576 : napi_set_last_error(napi_pending_exception))
598577
599578// Static last error returned from napi_get_last_error_info
600- napi_extended_error_info static_last_error = {};
579+ napi_extended_error_info static_last_error = { nullptr , nullptr , 0 , napi_ok };
601580
602581// Warning: Keep in-sync with napi_status enum
603582const char * error_messages[] = {nullptr ,
@@ -620,8 +599,7 @@ void napi_clear_last_error() {
620599}
621600
622601const napi_extended_error_info* napi_get_last_error_info () {
623- static_assert (
624- sizeof (error_messages) / sizeof (*error_messages) == napi_status_last,
602+ static_assert (node::arraysize (error_messages) == napi_status_last,
625603 " Count of error messages must match count of error values" );
626604 assert (static_last_error.error_code < napi_status_last);
627605
@@ -651,7 +629,7 @@ napi_status napi_create_function(napi_env env,
651629 NAPI_PREAMBLE (env);
652630 CHECK_ARG (result);
653631
654- v8::Isolate * isolate = v8impl::V8IsolateFromJsEnv (env);
632+ v8::Isolate* isolate = v8impl::V8IsolateFromJsEnv (env);
655633 v8::Local<v8::Function> return_value;
656634 v8::EscapableHandleScope scope (isolate);
657635 v8::Local<v8::Object> cbdata =
@@ -794,7 +772,7 @@ napi_status napi_get_propertynames(napi_env env,
794772 NAPI_PREAMBLE (env);
795773 CHECK_ARG (result);
796774
797- v8::Isolate * isolate = v8impl::V8IsolateFromJsEnv (env);
775+ v8::Isolate* isolate = v8impl::V8IsolateFromJsEnv (env);
798776 v8::Local<v8::Context> context = isolate->GetCurrentContext ();
799777 v8::Local<v8::Object> obj;
800778 CHECK_TO_OBJECT (context, obj, object);
@@ -814,7 +792,7 @@ napi_status napi_set_property(napi_env env,
814792 napi_value value) {
815793 NAPI_PREAMBLE (env);
816794
817- v8::Isolate * isolate = v8impl::V8IsolateFromJsEnv (env);
795+ v8::Isolate* isolate = v8impl::V8IsolateFromJsEnv (env);
818796 v8::Local<v8::Context> context = isolate->GetCurrentContext ();
819797 v8::Local<v8::Object> obj;
820798
@@ -880,7 +858,7 @@ napi_status napi_set_named_property(napi_env env,
880858 napi_value value) {
881859 NAPI_PREAMBLE (env);
882860
883- v8::Isolate * isolate = v8impl::V8IsolateFromJsEnv (env);
861+ v8::Isolate* isolate = v8impl::V8IsolateFromJsEnv (env);
884862 v8::Local<v8::Context> context = isolate->GetCurrentContext ();
885863 v8::Local<v8::Object> obj;
886864
@@ -1448,17 +1426,20 @@ napi_status napi_call_function(napi_env env,
14481426 NAPI_PREAMBLE (env);
14491427 CHECK_ARG (result);
14501428
1451- std::vector<v8::Handle <v8::Value>> args (argc);
1429+ std::vector<v8::Local <v8::Value>> args (argc);
14521430 v8::Isolate* isolate = v8impl::V8IsolateFromJsEnv (env);
14531431 v8::Local<v8::Context> context = isolate->GetCurrentContext ();
14541432
1455- v8::Handle <v8::Value> v8recv = v8impl::V8LocalValueFromJsValue (recv);
1433+ v8::Local <v8::Value> v8recv = v8impl::V8LocalValueFromJsValue (recv);
14561434
14571435 for (size_t i = 0 ; i < argc; i++) {
14581436 args[i] = v8impl::V8LocalValueFromJsValue (argv[i]);
14591437 }
14601438
1461- v8::Local<v8::Function> v8func = v8impl::V8LocalFunctionFromJsValue (func);
1439+ v8::Local<v8::Value> v8value = v8impl::V8LocalValueFromJsValue (func);
1440+ RETURN_STATUS_IF_FALSE (v8value->IsFunction (), napi_invalid_arg);
1441+
1442+ v8::Local<v8::Function> v8func = v8value.As <v8::Function>();
14621443 auto maybe = v8func->Call (context, v8recv, argc, args.data ());
14631444
14641445 if (try_catch.HasCaught ()) {
@@ -2007,13 +1988,15 @@ napi_status napi_new_instance(napi_env env,
20071988 v8::Isolate* isolate = v8impl::V8IsolateFromJsEnv (env);
20081989 v8::Local<v8::Context> context = isolate->GetCurrentContext ();
20091990
2010- std::vector<v8::Handle <v8::Value>> args (argc);
1991+ std::vector<v8::Local <v8::Value>> args (argc);
20111992 for (size_t i = 0 ; i < argc; i++) {
20121993 args[i] = v8impl::V8LocalValueFromJsValue (argv[i]);
20131994 }
20141995
2015- v8::Local<v8::Function> ctor =
2016- v8impl::V8LocalFunctionFromJsValue (constructor);
1996+ v8::Local<v8::Value> v8value = v8impl::V8LocalValueFromJsValue (constructor);
1997+ RETURN_STATUS_IF_FALSE (v8value->IsFunction (), napi_invalid_arg);
1998+
1999+ v8::Local<v8::Function> ctor = v8value.As <v8::Function>();
20172000
20182001 auto maybe = ctor->NewInstance (context, argc, args.data ());
20192002 CHECK_MAYBE_EMPTY (maybe, napi_generic_failure);
@@ -2094,7 +2077,7 @@ napi_status napi_make_callback(napi_env env,
20942077 v8impl::V8LocalValueFromJsValue (recv).As <v8::Object>();
20952078 v8::Local<v8::Function> v8func =
20962079 v8impl::V8LocalValueFromJsValue (func).As <v8::Function>();
2097- std::vector<v8::Handle <v8::Value>> args (argc);
2080+ std::vector<v8::Local <v8::Value>> args (argc);
20982081 for (size_t i = 0 ; i < argc; i++) {
20992082 args[i] = v8impl::V8LocalValueFromJsValue (argv[i]);
21002083 }
0 commit comments