@@ -1178,26 +1178,45 @@ napi_status napi_define_properties(napi_env env,
1178
1178
return napi_set_last_error (env, status);
1179
1179
}
1180
1180
1181
- v8::PropertyAttribute attributes =
1182
- v8impl::V8PropertyAttributesFromDescriptor (p);
1183
-
1184
1181
if (p->getter != nullptr || p->setter != nullptr ) {
1185
- v8::Local<v8::Value> cbdata = v8impl::CreateAccessorCallbackData (
1186
- env,
1187
- p->getter ,
1188
- p->setter ,
1189
- p->data );
1182
+ v8::Local<v8::Value> local_getter;
1183
+ v8::Local<v8::Value> local_setter;
1190
1184
1191
- auto set_maybe = obj->SetAccessor (
1192
- context,
1193
- property_name,
1194
- p->getter ? v8impl::GetterCallbackWrapper::Invoke : nullptr ,
1195
- p->setter ? v8impl::SetterCallbackWrapper::Invoke : nullptr ,
1196
- cbdata,
1197
- v8::AccessControl::DEFAULT,
1198
- attributes);
1185
+ if (p->getter != nullptr ) {
1186
+ v8::Local<v8::Value> getter_data =
1187
+ v8impl::CreateFunctionCallbackData (env, p->getter , p->data );
1188
+ CHECK_MAYBE_EMPTY (env, getter_data, napi_generic_failure);
1189
+
1190
+ v8::MaybeLocal<v8::Function> maybe_getter =
1191
+ v8::Function::New (context,
1192
+ v8impl::FunctionCallbackWrapper::Invoke,
1193
+ getter_data);
1194
+ CHECK_MAYBE_EMPTY (env, maybe_getter, napi_generic_failure);
1195
+
1196
+ local_getter = maybe_getter.ToLocalChecked ();
1197
+ }
1198
+ if (p->setter != nullptr ) {
1199
+ v8::Local<v8::Value> setter_data =
1200
+ v8impl::CreateFunctionCallbackData (env, p->setter , p->data );
1201
+ CHECK_MAYBE_EMPTY (env, setter_data, napi_generic_failure);
1202
+
1203
+ v8::MaybeLocal<v8::Function> maybe_setter =
1204
+ v8::Function::New (context,
1205
+ v8impl::FunctionCallbackWrapper::Invoke,
1206
+ setter_data);
1207
+ CHECK_MAYBE_EMPTY (env, maybe_setter, napi_generic_failure);
1208
+ local_setter = maybe_setter.ToLocalChecked ();
1209
+ }
1199
1210
1200
- if (!set_maybe.FromMaybe (false )) {
1211
+ v8::PropertyDescriptor descriptor (local_getter, local_setter);
1212
+ descriptor.set_enumerable ((p->attributes & napi_enumerable) != 0 );
1213
+ descriptor.set_configurable ((p->attributes & napi_configurable) != 0 );
1214
+
1215
+ auto define_maybe = obj->DefineProperty (context,
1216
+ property_name,
1217
+ descriptor);
1218
+
1219
+ if (!define_maybe.FromMaybe (false )) {
1201
1220
return napi_set_last_error (env, napi_invalid_arg);
1202
1221
}
1203
1222
} else if (p->method != nullptr ) {
@@ -1213,17 +1232,28 @@ napi_status napi_define_properties(napi_env env,
1213
1232
1214
1233
CHECK_MAYBE_EMPTY (env, maybe_fn, napi_generic_failure);
1215
1234
1216
- auto define_maybe = obj->DefineOwnProperty (
1217
- context, property_name, maybe_fn.ToLocalChecked (), attributes);
1235
+ v8::PropertyDescriptor descriptor (maybe_fn.ToLocalChecked (),
1236
+ (p->attributes & napi_writable) != 0 );
1237
+ descriptor.set_enumerable ((p->attributes & napi_enumerable) != 0 );
1238
+ descriptor.set_configurable ((p->attributes & napi_configurable) != 0 );
1239
+
1240
+ auto define_maybe = obj->DefineProperty (context,
1241
+ property_name,
1242
+ descriptor);
1218
1243
1219
1244
if (!define_maybe.FromMaybe (false )) {
1220
1245
return napi_set_last_error (env, napi_generic_failure);
1221
1246
}
1222
1247
} else {
1223
1248
v8::Local<v8::Value> value = v8impl::V8LocalValueFromJsValue (p->value );
1224
1249
1250
+ v8::PropertyDescriptor descriptor (value,
1251
+ (p->attributes & napi_writable) != 0 );
1252
+ descriptor.set_enumerable ((p->attributes & napi_enumerable) != 0 );
1253
+ descriptor.set_configurable ((p->attributes & napi_configurable) != 0 );
1254
+
1225
1255
auto define_maybe =
1226
- obj->DefineOwnProperty (context, property_name, value, attributes );
1256
+ obj->DefineProperty (context, property_name, descriptor );
1227
1257
1228
1258
if (!define_maybe.FromMaybe (false )) {
1229
1259
return napi_set_last_error (env, napi_invalid_arg);
0 commit comments