@ -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,25 +792,11 @@ 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 ) {
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 ,
v8 : : Signature : : New ( isolate , tpl ) ) ;
t - > SetClassName ( property_name ) ;
tpl - > PrototypeTemplate ( ) - > Set ( property_name , t , attributes ) ;
} else if ( p - > getter | | p - > setter ) {
if ( p - > getter ! = nullptr | | p - > setter ! = nullptr ) {
v8 : : Local < v8 : : Object > cbdata = v8impl : : CreateAccessorCallbackData (
env , p - > getter , p - > setter , p - > data ) ;
@ -813,6 +807,20 @@ napi_status napi_define_class(napi_env env,
cbdata ,
v8 : : AccessControl : : DEFAULT ,
attributes ) ;
} 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 ,
v8 : : Signature : : New ( isolate , tpl ) ) ;
t - > SetClassName ( property_name ) ;
tpl - > PrototypeTemplate ( ) - > Set ( property_name , t , 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,10 +1102,28 @@ 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 ) ) ;
v8impl : : V8PropertyAttributesFromDescriptor ( p ) ;
if ( p - > getter ! = nullptr | | p - > setter ! = nullptr ) {
v8 : : Local < v8 : : Object > cbdata = v8impl : : CreateAccessorCallbackData (
env ,
p - > getter ,
p - > setter ,
p - > data ) ;
if ( p - > method ) {
auto set_maybe = obj - > SetAccessor (
context ,
name ,
p - > getter ? v8impl : : GetterCallbackWrapper : : Invoke : nullptr ,
p - > setter ? v8impl : : SetterCallbackWrapper : : Invoke : nullptr ,
cbdata ,
v8 : : AccessControl : : DEFAULT ,
attributes ) ;
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 ) ;
@ -1112,25 +1138,6 @@ napi_status napi_define_properties(napi_env env,
if ( ! define_maybe . FromMaybe ( false ) ) {
return napi_set_last_error ( env , napi_generic_failure ) ;
}
} else if ( p - > getter | | p - > setter ) {
v8 : : Local < v8 : : Object > cbdata = v8impl : : CreateAccessorCallbackData (
env ,
p - > getter ,
p - > setter ,
p - > data ) ;
auto set_maybe = obj - > SetAccessor (
context ,
name ,
p - > getter ? v8impl : : GetterCallbackWrapper : : Invoke : nullptr ,
p - > setter ? v8impl : : SetterCallbackWrapper : : Invoke : nullptr ,
cbdata ,
v8 : : AccessControl : : DEFAULT ,
attributes ) ;
if ( ! set_maybe . FromMaybe ( false ) ) {
return napi_set_last_error ( env , napi_invalid_arg ) ;
}
} else {
v8 : : Local < v8 : : Value > value = v8impl : : V8LocalValueFromJsValue ( p - > value ) ;