@ -35,18 +35,26 @@ class napi_env__ {
namespace v8impl {
// 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 ;
static inline v8 : : PropertyAttribute V8PropertyAttributesFromDescriptor (
const napi_property_descriptor * descriptor ) {
unsigned int attribute_flags = v8 : : PropertyAttribute : : None ;
if ( descriptor - > getter ! = nullptr | | descriptor - > setter ! = nullptr ) {
// The napi_writable attribute is ignored for accessor descriptors, but
// V8 requires the ReadOnly attribute to match nonexistence of a setter.
attribute_flags | = ( descriptor - > setter = = nullptr ?
v8 : : PropertyAttribute : : ReadOnly : v8 : : PropertyAttribute : : None ) ;
} else if ( ( descriptor - > attributes & napi_writable ) = = 0 ) {
attribute_flags | = v8 : : PropertyAttribute : : ReadOnly ;
}
if ( attributes & napi_dont_enum ) {
attribute_flags | = v8 : : DontEnum ;
if ( ( descriptor - > attributes & napi_enumerable ) = = 0 ) {
attribute_flags | = v8 : : PropertyAttribute : : DontEnum ;
}
if ( attributes & napi_dont_delete ) {
attribute_flags | = v8 : : DontDelete ;
if ( ( descriptor - > attributes & napi_configurable ) = = 0 ) {
attribute_flags | = v8 : : PropertyAttribute : : DontDelete ;
}
return static_cast < v8 : : PropertyAttribute > ( attribute_flags ) ;
}
@ -775,7 +783,7 @@ napi_status napi_define_class(napi_env env,
for ( size_t i = 0 ; i < property_count ; i + + ) {
const napi_property_descriptor * p = properties + i ;
if ( ( p - > attributes & napi_static_property ) ! = 0 ) {
if ( ( p - > attributes & napi_static ) ! = 0 ) {
// Static properties are handled separately below.
static_property_count + + ;
continue ;
@ -784,11 +792,22 @@ napi_status napi_define_class(napi_env env,
v8 : : Local < v8 : : String > property_name ;
CHECK_NEW_FROM_UTF8 ( env , property_name , p - > utf8name ) ;
v8 : : PropertyAttribute attributes =
v8impl : : V8PropertyAttributesFromAttributes ( p - > attributes ) ;
v8impl : : V8PropertyAttributesFromDescriptor ( p ) ;
// This code is similar to that in napi_define_property (); the
// This code is similar to that in napi_define_properties (); the
// difference is it applies to a template instead of an object.
if ( p - > method ) {
if ( p - > getter ! = nullptr | | p - > setter ! = nullptr ) {
v8 : : Local < v8 : : Object > cbdata = v8impl : : CreateAccessorCallbackData (
env , p - > getter , p - > setter , p - > data ) ;
tpl - > PrototypeTemplate ( ) - > SetAccessor (
property_name ,
p - > getter ? v8impl : : GetterCallbackWrapper : : Invoke : nullptr ,
p - > setter ? v8impl : : SetterCallbackWrapper : : Invoke : nullptr ,
cbdata ,
v8 : : AccessControl : : DEFAULT ,
attributes ) ;
} else if ( p - > method ! = nullptr ) {
v8 : : Local < v8 : : Object > cbdata =
v8impl : : CreateFunctionCallbackData ( env , p - > method , p - > data ) ;
@ -802,17 +821,6 @@ napi_status napi_define_class(napi_env env,
t - > SetClassName ( property_name ) ;
tpl - > PrototypeTemplate ( ) - > Set ( property_name , t , attributes ) ;
} else if ( p - > getter | | p - > setter ) {
v8 : : Local < v8 : : Object > cbdata = v8impl : : CreateAccessorCallbackData (
env , p - > getter , p - > setter , p - > data ) ;
tpl - > PrototypeTemplate ( ) - > SetAccessor (
property_name ,
p - > getter ? v8impl : : GetterCallbackWrapper : : Invoke : nullptr ,
p - > setter ? v8impl : : SetterCallbackWrapper : : Invoke : nullptr ,
cbdata ,
v8 : : AccessControl : : DEFAULT ,
attributes ) ;
} else {
v8 : : Local < v8 : : Value > value = v8impl : : V8LocalValueFromJsValue ( p - > value ) ;
tpl - > PrototypeTemplate ( ) - > Set ( property_name , value , attributes ) ;
@ -827,7 +835,7 @@ napi_status napi_define_class(napi_env env,
for ( size_t i = 0 ; i < property_count ; i + + ) {
const napi_property_descriptor * p = properties + i ;
if ( ( p - > attributes & napi_static_property ) ! = 0 ) {
if ( ( p - > attributes & napi_static ) ! = 0 ) {
static_descriptors . push_back ( * p ) ;
}
}
@ -1094,25 +1102,9 @@ napi_status napi_define_properties(napi_env env,
CHECK_NEW_FROM_UTF8 ( env , name , p - > utf8name ) ;
v8 : : PropertyAttribute attributes =
v8impl : : V8PropertyAttributesFromAttributes (
( napi_property_attributes ) ( p - > attributes & ~ napi_static_property ) ) ;
if ( p - > method ) {
v8 : : Local < v8 : : Object > cbdata =
v8impl : : CreateFunctionCallbackData ( env , p - > method , p - > data ) ;
v8impl : : V8PropertyAttributesFromDescriptor ( p ) ;
RETURN_STATUS_IF_FALSE ( env , ! cbdata . IsEmpty ( ) , napi_generic_failure ) ;
v8 : : Local < v8 : : FunctionTemplate > t = v8 : : FunctionTemplate : : New (
isolate , v8impl : : FunctionCallbackWrapper : : Invoke , cbdata ) ;
auto define_maybe =
obj - > DefineOwnProperty ( context , name , t - > GetFunction ( ) , attributes ) ;
if ( ! define_maybe . FromMaybe ( false ) ) {
return napi_set_last_error ( env , napi_generic_failure ) ;
}
} else if ( p - > getter | | p - > setter ) {
if ( p - > getter ! = nullptr | | p - > setter ! = nullptr ) {
v8 : : Local < v8 : : Object > cbdata = v8impl : : CreateAccessorCallbackData (
env ,
p - > getter ,
@ -1131,6 +1123,21 @@ napi_status napi_define_properties(napi_env env,
if ( ! set_maybe . FromMaybe ( false ) ) {
return napi_set_last_error ( env , napi_invalid_arg ) ;
}
} else if ( p - > method ! = nullptr ) {
v8 : : Local < v8 : : Object > cbdata =
v8impl : : CreateFunctionCallbackData ( env , p - > method , p - > data ) ;
RETURN_STATUS_IF_FALSE ( env , ! cbdata . IsEmpty ( ) , napi_generic_failure ) ;
v8 : : Local < v8 : : FunctionTemplate > t = v8 : : FunctionTemplate : : New (
isolate , v8impl : : FunctionCallbackWrapper : : Invoke , cbdata ) ;
auto define_maybe =
obj - > DefineOwnProperty ( context , name , t - > GetFunction ( ) , attributes ) ;
if ( ! define_maybe . FromMaybe ( false ) ) {
return napi_set_last_error ( env , napi_generic_failure ) ;
}
} else {
v8 : : Local < v8 : : Value > value = v8impl : : V8LocalValueFromJsValue ( p - > value ) ;