@@ -79,12 +79,10 @@ inline static v8::PropertyAttribute V8PropertyAttributesFromDescriptor(
79
79
const napi_property_descriptor* descriptor) {
80
80
unsigned int attribute_flags = v8::PropertyAttribute::None;
81
81
82
- if (descriptor->getter != nullptr || descriptor->setter != nullptr ) {
83
- // The napi_writable attribute is ignored for accessor descriptors, but
84
- // V8 requires the ReadOnly attribute to match nonexistence of a setter.
85
- attribute_flags |= (descriptor->setter == nullptr ?
86
- v8::PropertyAttribute::ReadOnly : v8::PropertyAttribute::None);
87
- } else if ((descriptor->attributes & napi_writable) == 0 ) {
82
+ // The napi_writable attribute is ignored for accessor descriptors, but
83
+ // V8 would throw `TypeError`s on assignment with nonexistence of a setter.
84
+ if ((descriptor->getter == nullptr && descriptor->setter == nullptr ) &&
85
+ (descriptor->attributes & napi_writable) == 0 ) {
88
86
attribute_flags |= v8::PropertyAttribute::ReadOnly;
89
87
}
90
88
@@ -598,24 +596,6 @@ v8::Local<v8::Value> CreateFunctionCallbackData(napi_env env,
598
596
return cbdata;
599
597
}
600
598
601
- // Creates an object to be made available to the static getter/setter
602
- // callback wrapper, used to retrieve the native getter/setter callback
603
- // function and data pointer.
604
- inline v8::Local<v8::Value> CreateAccessorCallbackData (napi_env env,
605
- napi_callback getter,
606
- napi_callback setter,
607
- void * data) {
608
- CallbackBundle* bundle = new CallbackBundle ();
609
- bundle->function_or_getter = getter;
610
- bundle->setter = setter;
611
- bundle->cb_data = data;
612
- bundle->env = env;
613
- v8::Local<v8::Value> cbdata = v8::External::New (env->isolate , bundle);
614
- bundle->BindLifecycleTo (env->isolate , cbdata);
615
-
616
- return cbdata;
617
- }
618
-
619
599
enum WrapType {
620
600
retrievable,
621
601
anonymous
@@ -812,18 +792,33 @@ napi_status napi_define_class(napi_env env,
812
792
v8impl::V8PropertyAttributesFromDescriptor (p);
813
793
814
794
// This code is similar to that in napi_define_properties(); the
815
- // difference is it applies to a template instead of an object.
795
+ // difference is it applies to a template instead of an object,
796
+ // and preferred PropertyAttribute for lack of PropertyDescriptor
797
+ // support on ObjectTemplate.
816
798
if (p->getter != nullptr || p->setter != nullptr ) {
817
- v8::Local<v8::Value> cbdata = v8impl::CreateAccessorCallbackData (
818
- env, p->getter , p->setter , p->data );
799
+ v8::Local<v8::FunctionTemplate> getter_tpl;
800
+ v8::Local<v8::FunctionTemplate> setter_tpl;
801
+ if (p->getter != nullptr ) {
802
+ v8::Local<v8::Value> getter_data =
803
+ v8impl::CreateFunctionCallbackData (env, p->getter , p->data );
804
+
805
+ getter_tpl = v8::FunctionTemplate::New (
806
+ isolate, v8impl::FunctionCallbackWrapper::Invoke, getter_data);
807
+ }
808
+ if (p->setter != nullptr ) {
809
+ v8::Local<v8::Value> setter_data =
810
+ v8impl::CreateFunctionCallbackData (env, p->setter , p->data );
811
+
812
+ setter_tpl = v8::FunctionTemplate::New (
813
+ isolate, v8impl::FunctionCallbackWrapper::Invoke, setter_data);
814
+ }
819
815
820
- tpl->PrototypeTemplate ()->SetAccessor (
816
+ tpl->PrototypeTemplate ()->SetAccessorProperty (
821
817
property_name,
822
- p->getter ? v8impl::GetterCallbackWrapper::Invoke : nullptr ,
823
- p->setter ? v8impl::SetterCallbackWrapper::Invoke : nullptr ,
824
- cbdata,
825
- v8::AccessControl::DEFAULT,
826
- attributes);
818
+ getter_tpl,
819
+ setter_tpl,
820
+ attributes,
821
+ v8::AccessControl::DEFAULT);
827
822
} else if (p->method != nullptr ) {
828
823
v8::Local<v8::Value> cbdata =
829
824
v8impl::CreateFunctionCallbackData (env, p->method , p->data );
0 commit comments