@@ -392,9 +392,6 @@ class FunctionCallbackWrapper : public CallbackWrapperBase {
392
392
}
393
393
};
394
394
395
- enum WrapType { retrievable, anonymous };
396
-
397
- template <WrapType wrap_type>
398
395
inline napi_status Wrap (napi_env env,
399
396
napi_value js_object,
400
397
void * native_object,
@@ -410,47 +407,36 @@ inline napi_status Wrap(napi_env env,
410
407
RETURN_STATUS_IF_FALSE (env, value->IsObject (), napi_invalid_arg);
411
408
v8::Local<v8::Object> obj = value.As <v8::Object>();
412
409
413
- if (wrap_type == retrievable) {
414
- // If we've already wrapped this object, we error out.
415
- RETURN_STATUS_IF_FALSE (
416
- env,
417
- !obj->HasPrivate (context, NAPI_PRIVATE_KEY (context, wrapper))
418
- .FromJust (),
419
- napi_invalid_arg);
420
- } else if (wrap_type == anonymous) {
421
- // If no finalize callback is provided, we error out.
422
- CHECK_ARG (env, finalize_cb);
423
- }
410
+ // If we've already wrapped this object, we error out.
411
+ RETURN_STATUS_IF_FALSE (
412
+ env,
413
+ !obj->HasPrivate (context, NAPI_PRIVATE_KEY (context, wrapper)).FromJust (),
414
+ napi_invalid_arg);
424
415
425
- v8impl::Reference* reference = nullptr ;
416
+ // Create a self-deleting reference if the optional out-param result is not
417
+ // set.
418
+ bool delete_self = true ;
426
419
if (result != nullptr ) {
427
420
// The returned reference should be deleted via napi_delete_reference()
428
421
// ONLY in response to the finalize callback invocation. (If it is deleted
429
422
// before then, then the finalize callback will never be invoked.)
430
423
// Therefore a finalize callback is required when returning a reference.
431
424
CHECK_ARG (env, finalize_cb);
432
- reference = v8impl::Reference::New (
433
- env, obj, 0 , false , finalize_cb, native_object, finalize_hint);
425
+ delete_self = false ;
426
+ }
427
+
428
+ v8impl::Reference* reference = v8impl::Reference::New (
429
+ env, obj, 0 , delete_self, finalize_cb, native_object, finalize_hint);
430
+
431
+ if (result != nullptr ) {
434
432
*result = reinterpret_cast <napi_ref>(reference);
435
- } else {
436
- // Create a self-deleting reference.
437
- reference = v8impl::Reference::New (
438
- env,
439
- obj,
440
- 0 ,
441
- true ,
442
- finalize_cb,
443
- native_object,
444
- finalize_cb == nullptr ? nullptr : finalize_hint);
445
- }
446
-
447
- if (wrap_type == retrievable) {
448
- CHECK (obj->SetPrivate (context,
449
- NAPI_PRIVATE_KEY (context, wrapper),
450
- v8::External::New (env->isolate , reference))
451
- .FromJust ());
452
433
}
453
434
435
+ CHECK (obj->SetPrivate (context,
436
+ NAPI_PRIVATE_KEY (context, wrapper),
437
+ v8::External::New (env->isolate , reference))
438
+ .FromJust ());
439
+
454
440
return GET_RETURN_STATUS (env);
455
441
}
456
442
@@ -2360,7 +2346,7 @@ napi_status NAPI_CDECL napi_wrap(napi_env env,
2360
2346
napi_finalize finalize_cb,
2361
2347
void * finalize_hint,
2362
2348
napi_ref* result) {
2363
- return v8impl::Wrap<v8impl::retrievable> (
2349
+ return v8impl::Wrap (
2364
2350
env, js_object, native_object, finalize_cb, finalize_hint, result);
2365
2351
}
2366
2352
@@ -3176,12 +3162,31 @@ napi_status NAPI_CDECL napi_run_script(napi_env env,
3176
3162
3177
3163
napi_status NAPI_CDECL napi_add_finalizer (napi_env env,
3178
3164
napi_value js_object,
3179
- void * native_object ,
3165
+ void * finalize_data ,
3180
3166
napi_finalize finalize_cb,
3181
3167
void * finalize_hint,
3182
3168
napi_ref* result) {
3183
- return v8impl::Wrap<v8impl::anonymous>(
3184
- env, js_object, native_object, finalize_cb, finalize_hint, result);
3169
+ // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw
3170
+ // JS exceptions.
3171
+ CHECK_ENV (env);
3172
+ CHECK_ARG (env, js_object);
3173
+ CHECK_ARG (env, finalize_cb);
3174
+
3175
+ v8::Local<v8::Value> v8_value = v8impl::V8LocalValueFromJsValue (js_object);
3176
+ if (!(v8_value->IsObject () || v8_value->IsFunction ())) {
3177
+ return napi_set_last_error (env, napi_invalid_arg);
3178
+ }
3179
+
3180
+ // Create a self-deleting reference if the optional out-param result is not
3181
+ // set.
3182
+ bool delete_self = result == nullptr ;
3183
+ v8impl::Reference* reference = v8impl::Reference::New (
3184
+ env, v8_value, 0 , delete_self, finalize_cb, finalize_data, finalize_hint);
3185
+
3186
+ if (result != nullptr ) {
3187
+ *result = reinterpret_cast <napi_ref>(reference);
3188
+ }
3189
+ return napi_clear_last_error (env);
3185
3190
}
3186
3191
3187
3192
napi_status NAPI_CDECL napi_adjust_external_memory (napi_env env,
0 commit comments