@@ -288,6 +288,31 @@ JsNameValueFromPropertyDescriptor(const napi_property_descriptor* p,
288
288
}
289
289
return napi_ok;
290
290
}
291
+
292
+ inline napi_status FindWrapper (JsValueRef obj, JsValueRef* result) {
293
+ // Search the object's prototype chain for the wrapper with external data.
294
+ // Usually the wrapper would be the first in the chain, but it is OK for
295
+ // other objects to be inserted in the prototype chain.
296
+ JsValueRef wrapper = obj;
297
+ bool hasExternalData = false ;
298
+
299
+ JsValueRef nullValue = JS_INVALID_REFERENCE;
300
+ CHECK_JSRT (JsGetNullValue (&nullValue));
301
+
302
+ do {
303
+ CHECK_JSRT (JsGetPrototype (wrapper, &wrapper));
304
+ if (wrapper == JS_INVALID_REFERENCE || wrapper == nullValue) {
305
+ *result = JS_INVALID_REFERENCE;
306
+ return napi_ok;
307
+ }
308
+
309
+ CHECK_JSRT (JsHasExternalData (wrapper, &hasExternalData));
310
+ } while (!hasExternalData);
311
+
312
+ *result = wrapper;
313
+ return napi_ok;
314
+ }
315
+
291
316
} // end of namespace jsrtimpl
292
317
293
318
// Intercepts the Node-V8 module registration callback. Converts parameters
@@ -1351,6 +1376,10 @@ napi_status napi_wrap(napi_env env,
1351
1376
napi_ref* result) {
1352
1377
JsValueRef value = reinterpret_cast <JsValueRef>(js_object);
1353
1378
1379
+ JsValueRef wrapper = JS_INVALID_REFERENCE;
1380
+ CHECK_NAPI (jsrtimpl::FindWrapper (value, &wrapper));
1381
+ RETURN_STATUS_IF_FALSE (wrapper == JS_INVALID_REFERENCE, napi_invalid_arg);
1382
+
1354
1383
jsrtimpl::ExternalData* externalData = new jsrtimpl::ExternalData (
1355
1384
env, native_object, finalize_cb, finalize_hint);
1356
1385
if (externalData == nullptr ) return napi_set_last_error (napi_generic_failure);
@@ -1376,18 +1405,9 @@ napi_status napi_wrap(napi_env env,
1376
1405
napi_status napi_unwrap (napi_env env, napi_value js_object, void ** result) {
1377
1406
JsValueRef value = reinterpret_cast <JsValueRef>(js_object);
1378
1407
1379
- // Search the object's prototype chain for the wrapper with external data.
1380
- // Usually the wrapper would be the first in the chain, but it is OK for
1381
- // other objects to be inserted in the prototype chain.
1382
- JsValueRef wrapper = value;
1383
- bool hasExternalData = false ;
1384
- do {
1385
- CHECK_JSRT (JsGetPrototype (wrapper, &wrapper));
1386
- if (wrapper == JS_INVALID_REFERENCE) {
1387
- return napi_invalid_arg;
1388
- }
1389
- CHECK_JSRT (JsHasExternalData (wrapper, &hasExternalData));
1390
- } while (!hasExternalData);
1408
+ JsValueRef wrapper = JS_INVALID_REFERENCE;
1409
+ CHECK_NAPI (jsrtimpl::FindWrapper (value, &wrapper));
1410
+ RETURN_STATUS_IF_FALSE (wrapper != JS_INVALID_REFERENCE, napi_invalid_arg);
1391
1411
1392
1412
jsrtimpl::ExternalData* externalData;
1393
1413
CHECK_JSRT (JsGetExternalData (
0 commit comments