@@ -179,13 +179,30 @@ class PropertyCallbackInfo {
179179};
180180
181181namespace imp {
182+
183+ // Recent V8 versions (currently Chromium/Electron's V8 snapshot; not yet in
184+ // any released Node) gained an ExternalPointerTypeTag parameter on
185+ // v8::External::Value(). Detect that API via the V8_EXTERNAL_POINTER_TAG_COUNT
186+ // macro (defined in <v8-internal.h> alongside the new signature) rather than a
187+ // V8_MAJOR_VERSION cutoff, since Node and Chromium ship divergent V8
188+ // snapshots under the same major version. Externals created by nan use
189+ // kExternalPointerTypeTagDefault (see imp::NewExternal in
190+ // nan_implementation_12_inl.h), so the same tag is used here on read.
191+ inline void * GetExternalPointer (v8::Local<v8::External> ext) {
192+ #ifdef V8_EXTERNAL_POINTER_TAG_COUNT
193+ return ext->Value (v8::kExternalPointerTypeTagDefault );
194+ #else
195+ return ext->Value ();
196+ #endif
197+ }
198+
182199static
183200void FunctionCallbackWrapper (const v8::FunctionCallbackInfo<v8::Value> &info) {
184201 v8::Local<v8::Object> obj = info.Data ().As <v8::Object>();
185202 FunctionCallback callback = reinterpret_cast <FunctionCallback>(
186203 reinterpret_cast <intptr_t >(
187- obj->GetInternalField (kFunctionIndex )
188- .As <v8::Value>().As <v8::External>()-> Value ( )));
204+ imp::GetExternalPointer ( obj->GetInternalField (kFunctionIndex )
205+ .As <v8::Value>().As <v8::External>())));
189206 FunctionCallbackInfo<v8::Value>
190207 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
191208 callback (cbinfo);
@@ -203,8 +220,8 @@ void GetterCallbackWrapper(
203220 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
204221 GetterCallback callback = reinterpret_cast <GetterCallback>(
205222 reinterpret_cast <intptr_t >(
206- obj->GetInternalField (kGetterIndex )
207- .As <v8::Value>().As <v8::External>()-> Value ( )));
223+ imp::GetExternalPointer ( obj->GetInternalField (kGetterIndex )
224+ .As <v8::Value>().As <v8::External>())));
208225 callback (property.As <v8::String>(), cbinfo);
209226}
210227
@@ -221,8 +238,8 @@ void SetterCallbackWrapper(
221238 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
222239 SetterCallback callback = reinterpret_cast <SetterCallback>(
223240 reinterpret_cast <intptr_t >(
224- obj->GetInternalField (kSetterIndex )
225- .As <v8::Value>().As <v8::External>()-> Value ( )));
241+ imp::GetExternalPointer ( obj->GetInternalField (kSetterIndex )
242+ .As <v8::Value>().As <v8::External>())));
226243 callback (property.As <v8::String>(), value, cbinfo);
227244}
228245
@@ -240,8 +257,8 @@ void GetterCallbackWrapper(
240257 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
241258 GetterCallback callback = reinterpret_cast <GetterCallback>(
242259 reinterpret_cast <intptr_t >(
243- obj->GetInternalField (kGetterIndex )
244- .As <v8::Value>().As <v8::External>()-> Value ( )));
260+ imp::GetExternalPointer ( obj->GetInternalField (kGetterIndex )
261+ .As <v8::Value>().As <v8::External>())));
245262 callback (property, cbinfo);
246263}
247264
@@ -258,8 +275,8 @@ void SetterCallbackWrapper(
258275 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
259276 SetterCallback callback = reinterpret_cast <SetterCallback>(
260277 reinterpret_cast <intptr_t >(
261- obj->GetInternalField (kSetterIndex )
262- .As <v8::Value>().As <v8::External>()-> Value ( )));
278+ imp::GetExternalPointer ( obj->GetInternalField (kSetterIndex )
279+ .As <v8::Value>().As <v8::External>())));
263280 callback (property, value, cbinfo);
264281}
265282
@@ -282,8 +299,8 @@ v8::Intercepted PropertyGetterCallbackWrapper(
282299 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
283300 PropertyGetterCallback callback = reinterpret_cast <PropertyGetterCallback>(
284301 reinterpret_cast <intptr_t >(
285- obj->GetInternalField (kPropertyGetterIndex )
286- .As <v8::Value>().As <v8::External>()-> Value ( )));
302+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyGetterIndex )
303+ .As <v8::Value>().As <v8::External>())));
287304 return callback (property.As <v8::String>(), cbinfo);
288305}
289306
@@ -300,8 +317,8 @@ v8::Intercepted PropertySetterCallbackWrapper(
300317 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
301318 PropertySetterCallback callback = reinterpret_cast <PropertySetterCallback>(
302319 reinterpret_cast <intptr_t >(
303- obj->GetInternalField (kPropertySetterIndex )
304- .As <v8::Value>().As <v8::External>()-> Value ( )));
320+ imp::GetExternalPointer ( obj->GetInternalField (kPropertySetterIndex )
321+ .As <v8::Value>().As <v8::External>())));
305322 return callback (property.As <v8::String>(), value, cbinfo);
306323}
307324
@@ -320,8 +337,8 @@ void PropertyGetterCallbackWrapper(
320337 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
321338 PropertyGetterCallback callback = reinterpret_cast <PropertyGetterCallback>(
322339 reinterpret_cast <intptr_t >(
323- obj->GetInternalField (kPropertyGetterIndex )
324- .As <v8::Value>().As <v8::External>()-> Value ( )));
340+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyGetterIndex )
341+ .As <v8::Value>().As <v8::External>())));
325342 callback (property.As <v8::String>(), cbinfo);
326343}
327344
@@ -338,8 +355,8 @@ void PropertySetterCallbackWrapper(
338355 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
339356 PropertySetterCallback callback = reinterpret_cast <PropertySetterCallback>(
340357 reinterpret_cast <intptr_t >(
341- obj->GetInternalField (kPropertySetterIndex )
342- .As <v8::Value>().As <v8::External>()-> Value ( )));
358+ imp::GetExternalPointer ( obj->GetInternalField (kPropertySetterIndex )
359+ .As <v8::Value>().As <v8::External>())));
343360 callback (property.As <v8::String>(), value, cbinfo);
344361}
345362
@@ -357,8 +374,8 @@ void PropertyEnumeratorCallbackWrapper(
357374 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
358375 PropertyEnumeratorCallback callback =
359376 reinterpret_cast <PropertyEnumeratorCallback>(reinterpret_cast <intptr_t >(
360- obj->GetInternalField (kPropertyEnumeratorIndex )
361- .As <v8::Value>().As <v8::External>()-> Value ( )));
377+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyEnumeratorIndex )
378+ .As <v8::Value>().As <v8::External>())));
362379 callback (cbinfo);
363380}
364381
@@ -376,8 +393,8 @@ v8::Intercepted PropertyDeleterCallbackWrapper(
376393 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
377394 PropertyDeleterCallback callback = reinterpret_cast <PropertyDeleterCallback>(
378395 reinterpret_cast <intptr_t >(
379- obj->GetInternalField (kPropertyDeleterIndex )
380- .As <v8::Value>().As <v8::External>()-> Value ( )));
396+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyDeleterIndex )
397+ .As <v8::Value>().As <v8::External>())));
381398 return callback (property.As <v8::String>(), cbinfo);
382399}
383400
@@ -394,8 +411,8 @@ v8::Intercepted PropertyQueryCallbackWrapper(
394411 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
395412 PropertyQueryCallback callback = reinterpret_cast <PropertyQueryCallback>(
396413 reinterpret_cast <intptr_t >(
397- obj->GetInternalField (kPropertyQueryIndex )
398- .As <v8::Value>().As <v8::External>()-> Value ( )));
414+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyQueryIndex )
415+ .As <v8::Value>().As <v8::External>())));
399416 return callback (property.As <v8::String>(), cbinfo);
400417}
401418
@@ -411,8 +428,8 @@ void PropertyDeleterCallbackWrapper(
411428 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
412429 PropertyDeleterCallback callback = reinterpret_cast <PropertyDeleterCallback>(
413430 reinterpret_cast <intptr_t >(
414- obj->GetInternalField (kPropertyDeleterIndex )
415- .As <v8::Value>().As <v8::External>()-> Value ( )));
431+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyDeleterIndex )
432+ .As <v8::Value>().As <v8::External>())));
416433 callback (property.As <v8::String>(), cbinfo);
417434}
418435
@@ -428,8 +445,8 @@ void PropertyQueryCallbackWrapper(
428445 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
429446 PropertyQueryCallback callback = reinterpret_cast <PropertyQueryCallback>(
430447 reinterpret_cast <intptr_t >(
431- obj->GetInternalField (kPropertyQueryIndex )
432- .As <v8::Value>().As <v8::External>()-> Value ( )));
448+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyQueryIndex )
449+ .As <v8::Value>().As <v8::External>())));
433450 callback (property.As <v8::String>(), cbinfo);
434451}
435452
@@ -446,8 +463,8 @@ void PropertyGetterCallbackWrapper(
446463 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
447464 PropertyGetterCallback callback = reinterpret_cast <PropertyGetterCallback>(
448465 reinterpret_cast <intptr_t >(
449- obj->GetInternalField (kPropertyGetterIndex )
450- .As <v8::Value>().As <v8::External>()-> Value ( )));
466+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyGetterIndex )
467+ .As <v8::Value>().As <v8::External>())));
451468 callback (property, cbinfo);
452469}
453470
@@ -464,8 +481,8 @@ void PropertySetterCallbackWrapper(
464481 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
465482 PropertySetterCallback callback = reinterpret_cast <PropertySetterCallback>(
466483 reinterpret_cast <intptr_t >(
467- obj->GetInternalField (kPropertySetterIndex )
468- .As <v8::Value>().As <v8::External>()-> Value ( )));
484+ imp::GetExternalPointer ( obj->GetInternalField (kPropertySetterIndex )
485+ .As <v8::Value>().As <v8::External>())));
469486 callback (property, value, cbinfo);
470487}
471488
@@ -482,8 +499,8 @@ void PropertyEnumeratorCallbackWrapper(
482499 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
483500 PropertyEnumeratorCallback callback =
484501 reinterpret_cast <PropertyEnumeratorCallback>(reinterpret_cast <intptr_t >(
485- obj->GetInternalField (kPropertyEnumeratorIndex )
486- .As <v8::Value>().As <v8::External>()-> Value ( )));
502+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyEnumeratorIndex )
503+ .As <v8::Value>().As <v8::External>())));
487504 callback (cbinfo);
488505}
489506
@@ -499,8 +516,8 @@ void PropertyDeleterCallbackWrapper(
499516 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
500517 PropertyDeleterCallback callback = reinterpret_cast <PropertyDeleterCallback>(
501518 reinterpret_cast <intptr_t >(
502- obj->GetInternalField (kPropertyDeleterIndex )
503- .As <v8::Value>().As <v8::External>()-> Value ( )));
519+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyDeleterIndex )
520+ .As <v8::Value>().As <v8::External>())));
504521 callback (property, cbinfo);
505522}
506523
@@ -516,8 +533,8 @@ void PropertyQueryCallbackWrapper(
516533 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
517534 PropertyQueryCallback callback = reinterpret_cast <PropertyQueryCallback>(
518535 reinterpret_cast <intptr_t >(
519- obj->GetInternalField (kPropertyQueryIndex )
520- .As <v8::Value>().As <v8::External>()-> Value ( )));
536+ imp::GetExternalPointer ( obj->GetInternalField (kPropertyQueryIndex )
537+ .As <v8::Value>().As <v8::External>())));
521538 callback (property, cbinfo);
522539}
523540
@@ -535,8 +552,8 @@ v8::Intercepted IndexGetterCallbackWrapper(
535552 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
536553 IndexGetterCallback callback = reinterpret_cast <IndexGetterCallback>(
537554 reinterpret_cast <intptr_t >(
538- obj->GetInternalField (kIndexPropertyGetterIndex )
539- .As <v8::Value>().As <v8::External>()-> Value ( )));
555+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertyGetterIndex )
556+ .As <v8::Value>().As <v8::External>())));
540557 return callback (index, cbinfo);
541558}
542559
@@ -553,8 +570,8 @@ v8::Intercepted IndexSetterCallbackWrapper(
553570 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
554571 IndexSetterCallback callback = reinterpret_cast <IndexSetterCallback>(
555572 reinterpret_cast <intptr_t >(
556- obj->GetInternalField (kIndexPropertySetterIndex )
557- .As <v8::Value>().As <v8::External>()-> Value ( )));
573+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertySetterIndex )
574+ .As <v8::Value>().As <v8::External>())));
558575 return callback (index, value, cbinfo);
559576}
560577
@@ -572,8 +589,8 @@ void IndexGetterCallbackWrapper(
572589 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
573590 IndexGetterCallback callback = reinterpret_cast <IndexGetterCallback>(
574591 reinterpret_cast <intptr_t >(
575- obj->GetInternalField (kIndexPropertyGetterIndex )
576- .As <v8::Value>().As <v8::External>()-> Value ( )));
592+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertyGetterIndex )
593+ .As <v8::Value>().As <v8::External>())));
577594 callback (index, cbinfo);
578595}
579596
@@ -589,8 +606,8 @@ void IndexSetterCallbackWrapper(
589606 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
590607 IndexSetterCallback callback = reinterpret_cast <IndexSetterCallback>(
591608 reinterpret_cast <intptr_t >(
592- obj->GetInternalField (kIndexPropertySetterIndex )
593- .As <v8::Value>().As <v8::External>()-> Value ( )));
609+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertySetterIndex )
610+ .As <v8::Value>().As <v8::External>())));
594611 callback (index, value, cbinfo);
595612}
596613
@@ -609,9 +626,9 @@ void IndexEnumeratorCallbackWrapper(
609626 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
610627 IndexEnumeratorCallback callback = reinterpret_cast <IndexEnumeratorCallback>(
611628 reinterpret_cast <intptr_t >(
612- obj->GetInternalField (
629+ imp::GetExternalPointer ( obj->GetInternalField (
613630 kIndexPropertyEnumeratorIndex )
614- .As <v8::Value>().As <v8::External>()-> Value ( )));
631+ .As <v8::Value>().As <v8::External>())));
615632 callback (cbinfo);
616633}
617634
@@ -628,8 +645,8 @@ v8::Intercepted IndexDeleterCallbackWrapper(
628645 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
629646 IndexDeleterCallback callback = reinterpret_cast <IndexDeleterCallback>(
630647 reinterpret_cast <intptr_t >(
631- obj->GetInternalField (kIndexPropertyDeleterIndex )
632- .As <v8::Value>().As <v8::External>()-> Value ( )));
648+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertyDeleterIndex )
649+ .As <v8::Value>().As <v8::External>())));
633650 return callback (index, cbinfo);
634651}
635652
@@ -644,8 +661,8 @@ v8::Intercepted IndexQueryCallbackWrapper(
644661 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
645662 IndexQueryCallback callback = reinterpret_cast <IndexQueryCallback>(
646663 reinterpret_cast <intptr_t >(
647- obj->GetInternalField (kIndexPropertyQueryIndex )
648- .As <v8::Value>().As <v8::External>()-> Value ( )));
664+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertyQueryIndex )
665+ .As <v8::Value>().As <v8::External>())));
649666 return callback (index, cbinfo);
650667}
651668
@@ -660,8 +677,8 @@ void IndexDeleterCallbackWrapper(
660677 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
661678 IndexDeleterCallback callback = reinterpret_cast <IndexDeleterCallback>(
662679 reinterpret_cast <intptr_t >(
663- obj->GetInternalField (kIndexPropertyDeleterIndex )
664- .As <v8::Value>().As <v8::External>()-> Value ( )));
680+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertyDeleterIndex )
681+ .As <v8::Value>().As <v8::External>())));
665682 callback (index, cbinfo);
666683}
667684
@@ -676,8 +693,8 @@ void IndexQueryCallbackWrapper(
676693 cbinfo (info, obj->GetInternalField (kDataIndex ).As <v8::Value>());
677694 IndexQueryCallback callback = reinterpret_cast <IndexQueryCallback>(
678695 reinterpret_cast <intptr_t >(
679- obj->GetInternalField (kIndexPropertyQueryIndex )
680- .As <v8::Value>().As <v8::External>()-> Value ( )));
696+ imp::GetExternalPointer ( obj->GetInternalField (kIndexPropertyQueryIndex )
697+ .As <v8::Value>().As <v8::External>())));
681698 callback (index, cbinfo);
682699}
683700
@@ -687,4 +704,4 @@ typedef void (*NativeIndexQuery)
687704#endif
688705} // end of namespace imp
689706
690- #endif // NAN_CALLBACKS_12_INL_H_
707+ #endif // NAN_CALLBACKS_12_INL_H_
0 commit comments