From 4a21e398d69ff139764c184f44fed327fdf7be72 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Mon, 3 Apr 2017 11:30:00 -0400 Subject: [PATCH] n-api: break dep between v8 and napi attributes The v8 n-api implementation had been depending on a one-to-one relationship between v8 and n-api v8 property attributes. Remove this dependency and fix coverity scan issue 165845. PR-URL: https://github.com/nodejs/node/pull/12191 Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Timothy Gu --- src/node_api.cc | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/node_api.cc b/src/node_api.cc index a94ee6af4fd2a9..b61964cf96fede 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -25,6 +25,22 @@ napi_env JsEnvFromV8Isolate(v8::Isolate* isolate) { return reinterpret_cast(isolate); } +// convert from n-api property attributes to v8::PropertyAttribute +static inline v8::PropertyAttribute V8PropertyAttributesFromAttributes( + napi_property_attributes attributes) { + unsigned int attribute_flags = v8::None; + if (attributes & napi_read_only) { + attribute_flags |= v8::ReadOnly; + } + if (attributes & napi_dont_enum) { + attribute_flags |= v8::DontEnum; + } + if (attributes & napi_dont_delete) { + attribute_flags |= v8::DontDelete; + } + return static_cast(attribute_flags); +} + v8::Isolate* V8IsolateFromJsEnv(napi_env e) { return reinterpret_cast(e); } @@ -740,9 +756,8 @@ napi_status napi_define_class(napi_env env, v8::Local property_name; CHECK_NEW_FROM_UTF8(isolate, property_name, p->utf8name); - v8::PropertyAttribute attributes = - static_cast(p->attributes); + v8impl::V8PropertyAttributesFromAttributes(p->attributes); // This code is similar to that in napi_define_property(); the // difference is it applies to a template instead of an object. @@ -1051,8 +1066,9 @@ napi_status napi_define_properties(napi_env env, v8::Local name; CHECK_NEW_FROM_UTF8(isolate, name, p->utf8name); - v8::PropertyAttribute attributes = static_cast( - p->attributes & ~napi_static_property); + v8::PropertyAttribute attributes = + v8impl::V8PropertyAttributesFromAttributes( + (napi_property_attributes)(p->attributes & ~napi_static_property)); if (p->method) { v8::Local cbdata =