diff --git a/doc/methods.md b/doc/methods.md index f9a5af38..52e4b9e2 100644 --- a/doc/methods.md +++ b/doc/methods.md @@ -505,6 +505,8 @@ void Nan::SetPrototypeMethod(v8::Local recv, Sets getters and setters for a property with a given name on an `ObjectTemplate` or a plain `Object`. Accepts getters with the `Nan::GetterCallback` signature (see Getter declaration) and setters with the `Nan::SetterCallback` signature (see Setter declaration). +**Note** `v8::AccessControl` was deprectaed in v8 14.2 and subsequently removed. To maintain backward compatibility new enum `enum AccessControl {DEFAULT = 0};` was added. Nan will determine v8 version used and switch to a correct signature. + Signature: ```c++ @@ -531,6 +533,21 @@ bool SetAccessor(v8::Local obj, v8::Local data = v8::Local(), v8::AccessControl settings = v8::DEFAULT, v8::PropertyAttribute attribute = v8::None) +// Starting from v8 14.2 new enum is used +void SetAccessor(v8::Local tpl, + v8::Local name, + Nan::GetterCallback getter, + Nan::SetterCallback setter = 0, + v8::Local data = v8::Local(), + enum Nan::AccessControl settings = DEFAULT, + v8::PropertyAttribute attribute = v8::None); +bool SetAccessor(v8::Local obj, + v8::Local name, + Nan::GetterCallback getter, + Nan::SetterCallback setter = 0, + v8::Local data = v8::Local(), + enum Nan::AccessControl settings = DEFAULT, + v8::PropertyAttribute attribute = v8::None) ``` See the V8 [`ObjectTemplate#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#aca0ed196f8a9adb1f68b1aadb6c9cd77) and [`Object#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ae91b3b56b357f285288c89fbddc46d1b) for further information about how to use `Nan::SetAccessor()`. diff --git a/nan.h b/nan.h index b9d191ae..76a2c703 100644 --- a/nan.h +++ b/nan.h @@ -2619,6 +2619,96 @@ inline void SetPrototypeMethod( } //=== Accessors and Such ======================================================= +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 14 \ + || (V8_MAJOR_VERSION == 14 && defined(V8_MINOR_VERSION) \ + && V8_MINOR_VERSION >= 2)) + +enum AccessControl {DEFAULT = 0}; + +inline void SetAccessor( + v8::Local tpl + , v8::Local name + , GetterCallback getter + , SetterCallback setter = 0 + , v8::Local data = v8::Local() + , enum AccessControl settings = DEFAULT + , v8::PropertyAttribute attribute = v8::None) { + HandleScope scope; + + imp::NativeGetter getter_ = + imp::GetterCallbackWrapper; + imp::NativeSetter setter_ = + setter ? imp::SetterCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kAccessorFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kGetterIndex + , New(reinterpret_cast(getter))); + + if (setter != 0) { + obj->SetInternalField( + imp::kSetterIndex + , New(reinterpret_cast(setter))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + + tpl->SetNativeDataProperty( + name + , getter_ + , setter_ + , obj + , attribute + ); +} + +inline bool SetAccessor( + v8::Local obj + , v8::Local name + , GetterCallback getter + , SetterCallback setter = 0 + , v8::Local data = v8::Local() + , enum AccessControl settings = DEFAULT + , v8::PropertyAttribute attribute = v8::None) { + HandleScope scope; + + imp::NativeGetter getter_ = + imp::GetterCallbackWrapper; + imp::NativeSetter setter_ = + setter ? imp::SetterCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kAccessorFieldCount); + v8::Local dataobj = NewInstance(otpl).ToLocalChecked(); + + dataobj->SetInternalField( + imp::kGetterIndex + , New(reinterpret_cast(getter))); + + if (!data.IsEmpty()) { + dataobj->SetInternalField(imp::kDataIndex, data); + } + + if (setter) { + dataobj->SetInternalField( + imp::kSetterIndex + , New(reinterpret_cast(setter))); + } + return obj->SetNativeDataProperty( + GetCurrentContext() + , name + , getter_ + , setter_ + , dataobj + , attribute).FromMaybe(false); +} + +#else NAN_DEPRECATED inline void SetAccessor( v8::Local tpl @@ -2795,7 +2885,7 @@ inline bool SetAccessor( , attribute); #endif } - +#endif inline void SetNamedPropertyHandler( v8::Local tpl , PropertyGetterCallback getter