Skip to content

Commit d30ebaa

Browse files
committed
Merged nodejs#1015
1 parent 62a6679 commit d30ebaa

2 files changed

Lines changed: 94 additions & 61 deletions

File tree

nan_callbacks_12_inl.h

Lines changed: 74 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,30 @@ class PropertyCallbackInfo {
179179
};
180180

181181
namespace 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+
182199
static
183200
void 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_

nan_implementation_12_inl.h

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,22 @@
1414

1515
namespace imp {
1616

17+
// Recent V8 versions (currently Chromium/Electron's V8 snapshot; not yet in
18+
// any released Node) gained an ExternalPointerTypeTag parameter on
19+
// v8::External::New(). Detect that API via the V8_EXTERNAL_POINTER_TAG_COUNT
20+
// macro (defined in <v8-internal.h> alongside the new signature) rather than
21+
// a V8_MAJOR_VERSION cutoff, since Node and Chromium ship divergent V8
22+
// snapshots under the same major version. Externals created via this helper
23+
// are read back through imp::GetExternalPointer in nan_callbacks_12_inl.h,
24+
// which uses the matching kExternalPointerTypeTagDefault tag.
25+
inline v8::Local<v8::External> NewExternal(v8::Isolate* isolate, void* value) {
26+
#ifdef V8_EXTERNAL_POINTER_TAG_COUNT
27+
return v8::External::New(isolate, value, v8::kExternalPointerTypeTagDefault);
28+
#else
29+
return v8::External::New(isolate, value);
30+
#endif
31+
}
32+
1733
//=== Array ====================================================================
1834

1935
Factory<v8::Array>::return_t
@@ -76,7 +92,7 @@ Factory<v8::Date>::New(double value) {
7692

7793
Factory<v8::External>::return_t
7894
Factory<v8::External>::New(void * value) {
79-
return v8::External::New(v8::Isolate::GetCurrent(), value);
95+
return imp::NewExternal(v8::Isolate::GetCurrent(), value);
8096
}
8197

8298
//=== Function =================================================================
@@ -92,7 +108,7 @@ Factory<v8::Function>::New( FunctionCallback callback
92108

93109
obj->SetInternalField(
94110
imp::kFunctionIndex
95-
, v8::External::New(isolate, reinterpret_cast<void *>(callback)));
111+
, imp::NewExternal(isolate, reinterpret_cast<void *>(callback)));
96112

97113
v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);
98114

@@ -128,7 +144,7 @@ Factory<v8::FunctionTemplate>::New( FunctionCallback callback
128144

129145
obj->SetInternalField(
130146
imp::kFunctionIndex
131-
, v8::External::New(isolate, reinterpret_cast<void *>(callback)));
147+
, imp::NewExternal(isolate, reinterpret_cast<void *>(callback)));
132148
v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);
133149

134150
if (!val.IsEmpty()) {
@@ -427,4 +443,4 @@ inline v8::Local<T> New(Global<T> const& p) {
427443
return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
428444
}
429445

430-
#endif // NAN_IMPLEMENTATION_12_INL_H_
446+
#endif // NAN_IMPLEMENTATION_12_INL_H_

0 commit comments

Comments
 (0)