Skip to content

Commit 333d989

Browse files
authored
Updating SetAccessor method to support v8 14.4 (#1007)
* updating SetAccessor method to reflect deprecation in v8 14.2 and removal in 14.4 * updating docs to reflect SetAccessor method changes
1 parent 5d0ff9c commit 333d989

File tree

2 files changed

+108
-1
lines changed

2 files changed

+108
-1
lines changed

doc/methods.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,8 @@ void Nan::SetPrototypeMethod(v8::Local<v8::FunctionTemplate> recv,
505505

506506
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 <a href="#api_nan_getter">Getter declaration</a>) and setters with the `Nan::SetterCallback` signature (see <a href="#api_nan_setter">Setter declaration</a>).
507507

508+
**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.
509+
508510
Signature:
509511

510512
```c++
@@ -531,6 +533,21 @@ bool SetAccessor(v8::Local<v8::Object> obj,
531533
v8::Local<v8::Value> data = v8::Local<v8::Value>(),
532534
v8::AccessControl settings = v8::DEFAULT,
533535
v8::PropertyAttribute attribute = v8::None)
536+
// Starting from v8 14.2 new enum is used
537+
void SetAccessor(v8::Local<v8::ObjectTemplate> tpl,
538+
v8::Local<v8::String> name,
539+
Nan::GetterCallback getter,
540+
Nan::SetterCallback setter = 0,
541+
v8::Local<v8::Value> data = v8::Local<v8::Value>(),
542+
enum Nan::AccessControl settings = DEFAULT,
543+
v8::PropertyAttribute attribute = v8::None);
544+
bool SetAccessor(v8::Local<v8::Object> obj,
545+
v8::Local<v8::String> name,
546+
Nan::GetterCallback getter,
547+
Nan::SetterCallback setter = 0,
548+
v8::Local<v8::Value> data = v8::Local<v8::Value>(),
549+
enum Nan::AccessControl settings = DEFAULT,
550+
v8::PropertyAttribute attribute = v8::None)
534551
```
535552
536553
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()`.

nan.h

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2619,6 +2619,96 @@ inline void SetPrototypeMethod(
26192619
}
26202620

26212621
//=== Accessors and Such =======================================================
2622+
#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 14 \
2623+
|| (V8_MAJOR_VERSION == 14 && defined(V8_MINOR_VERSION) \
2624+
&& V8_MINOR_VERSION >= 2))
2625+
2626+
enum AccessControl {DEFAULT = 0};
2627+
2628+
inline void SetAccessor(
2629+
v8::Local<v8::ObjectTemplate> tpl
2630+
, v8::Local<v8::String> name
2631+
, GetterCallback getter
2632+
, SetterCallback setter = 0
2633+
, v8::Local<v8::Value> data = v8::Local<v8::Value>()
2634+
, enum AccessControl settings = DEFAULT
2635+
, v8::PropertyAttribute attribute = v8::None) {
2636+
HandleScope scope;
2637+
2638+
imp::NativeGetter getter_ =
2639+
imp::GetterCallbackWrapper;
2640+
imp::NativeSetter setter_ =
2641+
setter ? imp::SetterCallbackWrapper : 0;
2642+
2643+
v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
2644+
otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
2645+
v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
2646+
2647+
obj->SetInternalField(
2648+
imp::kGetterIndex
2649+
, New<v8::External>(reinterpret_cast<void *>(getter)));
2650+
2651+
if (setter != 0) {
2652+
obj->SetInternalField(
2653+
imp::kSetterIndex
2654+
, New<v8::External>(reinterpret_cast<void *>(setter)));
2655+
}
2656+
2657+
if (!data.IsEmpty()) {
2658+
obj->SetInternalField(imp::kDataIndex, data);
2659+
}
2660+
2661+
tpl->SetNativeDataProperty(
2662+
name
2663+
, getter_
2664+
, setter_
2665+
, obj
2666+
, attribute
2667+
);
2668+
}
2669+
2670+
inline bool SetAccessor(
2671+
v8::Local<v8::Object> obj
2672+
, v8::Local<v8::String> name
2673+
, GetterCallback getter
2674+
, SetterCallback setter = 0
2675+
, v8::Local<v8::Value> data = v8::Local<v8::Value>()
2676+
, enum AccessControl settings = DEFAULT
2677+
, v8::PropertyAttribute attribute = v8::None) {
2678+
HandleScope scope;
2679+
2680+
imp::NativeGetter getter_ =
2681+
imp::GetterCallbackWrapper;
2682+
imp::NativeSetter setter_ =
2683+
setter ? imp::SetterCallbackWrapper : 0;
2684+
2685+
v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
2686+
otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
2687+
v8::Local<v8::Object> dataobj = NewInstance(otpl).ToLocalChecked();
2688+
2689+
dataobj->SetInternalField(
2690+
imp::kGetterIndex
2691+
, New<v8::External>(reinterpret_cast<void *>(getter)));
2692+
2693+
if (!data.IsEmpty()) {
2694+
dataobj->SetInternalField(imp::kDataIndex, data);
2695+
}
2696+
2697+
if (setter) {
2698+
dataobj->SetInternalField(
2699+
imp::kSetterIndex
2700+
, New<v8::External>(reinterpret_cast<void *>(setter)));
2701+
}
2702+
return obj->SetNativeDataProperty(
2703+
GetCurrentContext()
2704+
, name
2705+
, getter_
2706+
, setter_
2707+
, dataobj
2708+
, attribute).FromMaybe(false);
2709+
}
2710+
2711+
#else
26222712

26232713
NAN_DEPRECATED inline void SetAccessor(
26242714
v8::Local<v8::ObjectTemplate> tpl
@@ -2795,7 +2885,7 @@ inline bool SetAccessor(
27952885
, attribute);
27962886
#endif
27972887
}
2798-
2888+
#endif
27992889
inline void SetNamedPropertyHandler(
28002890
v8::Local<v8::ObjectTemplate> tpl
28012891
, PropertyGetterCallback getter

0 commit comments

Comments
 (0)