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