Skip to content

Commit 116bd19

Browse files
committed
Address some minor PR feedback (#187)
- Simplify conversion to/from napi_value - Better names for CallbackWrapper template params - Fatal error when trying to set setter return value - Use node::arraysize - Replace v8::Handle with v8::Local - Align the star after v8::Isolate
1 parent fb8ced4 commit 116bd19

File tree

1 file changed

+33
-50
lines changed

1 file changed

+33
-50
lines changed

src/node_api.cc

+33-50
Original file line numberDiff line numberDiff line change
@@ -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

8182
napi_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

9286
v8::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>
279257
class 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
603582
const char* error_messages[] = {nullptr,
@@ -620,8 +599,7 @@ void napi_clear_last_error() {
620599
}
621600

622601
const 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

Comments
 (0)