Skip to content

Commit c546689

Browse files
authored
Fix v8::External::Value/New for the new ExternalPointerTypeTag API (#1015)
* Fix v8::External::Value/New calls for V8 13 V8 13 added an ExternalPointerTypeTag parameter (uint16_t pointer-tag for the sandbox) to both v8::External::New and v8::External::Value: static Local<External> New(Isolate*, void*, ExternalPointerTypeTag); void* Value(ExternalPointerTypeTag) const; The old zero-arg Value() and two-arg New(Isolate*, void*) overloads are gone, so any nan-using addon fails to compile against Electron 42 / Node 24's V8: nan_callbacks_12_inl.h(189): error C2664: 'void *v8::External::Value(v8::ExternalPointerTypeTag) const': cannot convert argument 1 from 'v8::Isolate *' to 'v8::ExternalPointerTypeTag' nan_implementation_12_inl.h(79): error C2660: 'v8::External::New': function does not take 2 arguments Add two private inline helpers in the existing imp:: namespace: imp::GetExternalPointer(v8::Local<v8::External>) imp::NewExternal(v8::Isolate*, void*) Each selects the V8 13+ signature when V8_MAJOR_VERSION >= 13 (passing v8::kExternalPointerTypeTagDefault, the documented no-tagging default for embedders that do not partition externals by type) and falls back to the legacy signature otherwise. All 28 Value() trampoline callsites in nan_callbacks_12_inl.h and all 3 New() factory callsites in nan_implementation_12_inl.h are routed through the helpers. Both helpers share kExternalPointerTypeTagDefault so the tag matches between create and read. No new macros are introduced. Tests ----- The existing news.cpp::NewExternal and nannew.cpp::testExternal cases call v8::External::Value() directly (consumer-side raw-V8 calls, not through nan), so they failed to compile against V8 13 in the same way as nan's headers. Added the same V8 13 guard inline at those two sites so the tests build and run on V8 13 while remaining identical on older V8. Together these two existing tests already cover the round-trip exercised by this fix: - news.cpp::NewExternal exercises the factory path: Nan::New<v8::External>(...) -> Factory<v8::External>::New(value) -> imp::NewExternal(isolate, value) -> v8::External::New(isolate, value, tag) - The trampoline path (imp::GetExternalPointer) is exercised every time any NAN_METHOD test is invoked from JS, including news.cpp::NewExternal itself, since FunctionCallbackWrapper unpacks the registered callback pointer through that helper before dispatching. Scope and what is not changed ----------------------------- This patch addresses the v8::External break specifically. Other unrelated V8 13 API changes in nan, if any, are out of scope (mirroring the prior nan_weak.h fix which was a separate, surgical commit). nan_callbacks_pre_12_inl.h and nan_implementation_pre_12_inl.h are intentionally untouched: they target NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION (Node <= 0.12, pre-V8-3.x), where neither overload exists. Backwards compatibility ----------------------- Every change is gated on `defined(V8_MAJOR_VERSION) && V8_MAJOR_VERSION >= 13`. On V8 <= 12 the else branch reproduces the original code byte-for-byte, so the patch is a no-op for every V8 version nan currently supports. * Expose Nan::GetExternalValue for the tagged v8::External::Value() API Promotes the read-side helper from imp:: to public Nan:: so addons can read v8::External values portably across V8 versions without their own V8_EXTERNAL_POINTER_TAG_COUNT branch. Tests drop the conditional.
1 parent a4edc5c commit c546689

7 files changed

Lines changed: 109 additions & 61 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ The hooks to access V8 internals—including GC and statistics—are different a
303303
- <a href="doc/v8_internals.md#api_nan_get_internal_field_pointer"><b><code>Nan::GetInternalFieldPointer()</code></b></a>
304304
- <a href="doc/v8_internals.md#api_nan_set_internal_field_pointer"><b><code>Nan::SetInternalFieldPointer()</code></b></a>
305305
- <a href="doc/v8_internals.md#api_nan_adjust_external_memory"><b><code>Nan::AdjustExternalMemory()</code></b></a>
306+
- <a href="doc/v8_internals.md#api_nan_get_external_value"><b><code>Nan::GetExternalValue()</code></b></a>
306307

307308

308309
### Miscellaneous V8 Helpers

doc/v8_internals.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ The hooks to access V8 internals—including GC and statistics—are different a
1717
- <a href="#api_nan_get_internal_field_pointer"><b><code>Nan::GetInternalFieldPointer()</code></b></a>
1818
- <a href="#api_nan_set_internal_field_pointer"><b><code>Nan::SetInternalFieldPointer()</code></b></a>
1919
- <a href="#api_nan_adjust_external_memory"><b><code>Nan::AdjustExternalMemory()</code></b></a>
20+
- <a href="#api_nan_get_external_value"><b><code>Nan::GetExternalValue()</code></b></a>
2021

2122

2223
<a name="api_nan_gc_callback"></a>
@@ -197,3 +198,14 @@ int Nan::AdjustExternalMemory(int bytesChange)
197198
198199
Calls V8's [`AdjustAmountOfExternalAllocatedMemory()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ae1a59cac60409d3922582c4af675473e).
199200
201+
<a name="api_nan_get_external_value"></a>
202+
### Nan::GetExternalValue()
203+
204+
Reads the pointer stored in a `v8::External`. On V8 versions that require an `ExternalPointerTypeTag` on `v8::External::Value()`, the default tag is applied (matching the tag used when the External is created via `Nan::New<v8::External>()`).
205+
206+
Signature:
207+
208+
```c++
209+
void* Nan::GetExternalValue(v8::Local<v8::External> ext)
210+
```
211+

nan_callbacks_12_inl.h

Lines changed: 71 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,27 @@ class PropertyCallbackInfo {
203203
NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo)
204204
};
205205

206+
// Gated on V8_EXTERNAL_POINTER_TAG_COUNT (defined alongside the tagged
207+
// Value() API) rather than a V8_MAJOR_VERSION cutoff, since Node and
208+
// Chromium/Electron ship divergent V8 snapshots under the same major.
209+
// Tag must match the one used by imp::NewExternal.
210+
inline void* GetExternalValue(v8::Local<v8::External> ext) {
211+
#ifdef V8_EXTERNAL_POINTER_TAG_COUNT
212+
return ext->Value(v8::kExternalPointerTypeTagDefault);
213+
#else
214+
return ext->Value();
215+
#endif
216+
}
217+
206218
namespace imp {
219+
207220
static
208221
void FunctionCallbackWrapper(const v8::FunctionCallbackInfo<v8::Value> &info) {
209222
v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
210223
FunctionCallback callback = reinterpret_cast<FunctionCallback>(
211224
reinterpret_cast<intptr_t>(
212-
obj->GetInternalField(kFunctionIndex)
213-
.As<v8::Value>().As<v8::External>()->Value()));
225+
Nan::GetExternalValue(obj->GetInternalField(kFunctionIndex)
226+
.As<v8::Value>().As<v8::External>())));
214227
FunctionCallbackInfo<v8::Value>
215228
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
216229
callback(cbinfo);
@@ -228,8 +241,8 @@ void GetterCallbackWrapper(
228241
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
229242
GetterCallback callback = reinterpret_cast<GetterCallback>(
230243
reinterpret_cast<intptr_t>(
231-
obj->GetInternalField(kGetterIndex)
232-
.As<v8::Value>().As<v8::External>()->Value()));
244+
Nan::GetExternalValue(obj->GetInternalField(kGetterIndex)
245+
.As<v8::Value>().As<v8::External>())));
233246
callback(property.As<v8::String>(), cbinfo);
234247
}
235248

@@ -246,8 +259,8 @@ void SetterCallbackWrapper(
246259
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
247260
SetterCallback callback = reinterpret_cast<SetterCallback>(
248261
reinterpret_cast<intptr_t>(
249-
obj->GetInternalField(kSetterIndex)
250-
.As<v8::Value>().As<v8::External>()->Value()));
262+
Nan::GetExternalValue(obj->GetInternalField(kSetterIndex)
263+
.As<v8::Value>().As<v8::External>())));
251264
callback(property.As<v8::String>(), value, cbinfo);
252265
}
253266

@@ -265,8 +278,8 @@ void GetterCallbackWrapper(
265278
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
266279
GetterCallback callback = reinterpret_cast<GetterCallback>(
267280
reinterpret_cast<intptr_t>(
268-
obj->GetInternalField(kGetterIndex)
269-
.As<v8::Value>().As<v8::External>()->Value()));
281+
Nan::GetExternalValue(obj->GetInternalField(kGetterIndex)
282+
.As<v8::Value>().As<v8::External>())));
270283
callback(property, cbinfo);
271284
}
272285

@@ -283,8 +296,8 @@ void SetterCallbackWrapper(
283296
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
284297
SetterCallback callback = reinterpret_cast<SetterCallback>(
285298
reinterpret_cast<intptr_t>(
286-
obj->GetInternalField(kSetterIndex)
287-
.As<v8::Value>().As<v8::External>()->Value()));
299+
Nan::GetExternalValue(obj->GetInternalField(kSetterIndex)
300+
.As<v8::Value>().As<v8::External>())));
288301
callback(property, value, cbinfo);
289302
}
290303

@@ -307,8 +320,8 @@ v8::Intercepted PropertyGetterCallbackWrapper(
307320
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
308321
PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
309322
reinterpret_cast<intptr_t>(
310-
obj->GetInternalField(kPropertyGetterIndex)
311-
.As<v8::Value>().As<v8::External>()->Value()));
323+
Nan::GetExternalValue(obj->GetInternalField(kPropertyGetterIndex)
324+
.As<v8::Value>().As<v8::External>())));
312325
return callback(property.As<v8::String>(), cbinfo);
313326
}
314327

@@ -325,8 +338,8 @@ v8::Intercepted PropertySetterCallbackWrapper(
325338
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
326339
PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
327340
reinterpret_cast<intptr_t>(
328-
obj->GetInternalField(kPropertySetterIndex)
329-
.As<v8::Value>().As<v8::External>()->Value()));
341+
Nan::GetExternalValue(obj->GetInternalField(kPropertySetterIndex)
342+
.As<v8::Value>().As<v8::External>())));
330343
return callback(property.As<v8::String>(), value, cbinfo);
331344
}
332345

@@ -345,8 +358,8 @@ void PropertyGetterCallbackWrapper(
345358
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
346359
PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
347360
reinterpret_cast<intptr_t>(
348-
obj->GetInternalField(kPropertyGetterIndex)
349-
.As<v8::Value>().As<v8::External>()->Value()));
361+
Nan::GetExternalValue(obj->GetInternalField(kPropertyGetterIndex)
362+
.As<v8::Value>().As<v8::External>())));
350363
callback(property.As<v8::String>(), cbinfo);
351364
}
352365

@@ -363,8 +376,8 @@ void PropertySetterCallbackWrapper(
363376
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
364377
PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
365378
reinterpret_cast<intptr_t>(
366-
obj->GetInternalField(kPropertySetterIndex)
367-
.As<v8::Value>().As<v8::External>()->Value()));
379+
Nan::GetExternalValue(obj->GetInternalField(kPropertySetterIndex)
380+
.As<v8::Value>().As<v8::External>())));
368381
callback(property.As<v8::String>(), value, cbinfo);
369382
}
370383

@@ -382,8 +395,8 @@ void PropertyEnumeratorCallbackWrapper(
382395
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
383396
PropertyEnumeratorCallback callback =
384397
reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
385-
obj->GetInternalField(kPropertyEnumeratorIndex)
386-
.As<v8::Value>().As<v8::External>()->Value()));
398+
Nan::GetExternalValue(obj->GetInternalField(kPropertyEnumeratorIndex)
399+
.As<v8::Value>().As<v8::External>())));
387400
callback(cbinfo);
388401
}
389402

@@ -401,8 +414,8 @@ v8::Intercepted PropertyDeleterCallbackWrapper(
401414
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
402415
PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
403416
reinterpret_cast<intptr_t>(
404-
obj->GetInternalField(kPropertyDeleterIndex)
405-
.As<v8::Value>().As<v8::External>()->Value()));
417+
Nan::GetExternalValue(obj->GetInternalField(kPropertyDeleterIndex)
418+
.As<v8::Value>().As<v8::External>())));
406419
return callback(property.As<v8::String>(), cbinfo);
407420
}
408421

@@ -419,8 +432,8 @@ v8::Intercepted PropertyQueryCallbackWrapper(
419432
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
420433
PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
421434
reinterpret_cast<intptr_t>(
422-
obj->GetInternalField(kPropertyQueryIndex)
423-
.As<v8::Value>().As<v8::External>()->Value()));
435+
Nan::GetExternalValue(obj->GetInternalField(kPropertyQueryIndex)
436+
.As<v8::Value>().As<v8::External>())));
424437
return callback(property.As<v8::String>(), cbinfo);
425438
}
426439

@@ -436,8 +449,8 @@ void PropertyDeleterCallbackWrapper(
436449
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
437450
PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
438451
reinterpret_cast<intptr_t>(
439-
obj->GetInternalField(kPropertyDeleterIndex)
440-
.As<v8::Value>().As<v8::External>()->Value()));
452+
Nan::GetExternalValue(obj->GetInternalField(kPropertyDeleterIndex)
453+
.As<v8::Value>().As<v8::External>())));
441454
callback(property.As<v8::String>(), cbinfo);
442455
}
443456

@@ -453,8 +466,8 @@ void PropertyQueryCallbackWrapper(
453466
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
454467
PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
455468
reinterpret_cast<intptr_t>(
456-
obj->GetInternalField(kPropertyQueryIndex)
457-
.As<v8::Value>().As<v8::External>()->Value()));
469+
Nan::GetExternalValue(obj->GetInternalField(kPropertyQueryIndex)
470+
.As<v8::Value>().As<v8::External>())));
458471
callback(property.As<v8::String>(), cbinfo);
459472
}
460473

@@ -471,8 +484,8 @@ void PropertyGetterCallbackWrapper(
471484
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
472485
PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
473486
reinterpret_cast<intptr_t>(
474-
obj->GetInternalField(kPropertyGetterIndex)
475-
.As<v8::Value>().As<v8::External>()->Value()));
487+
Nan::GetExternalValue(obj->GetInternalField(kPropertyGetterIndex)
488+
.As<v8::Value>().As<v8::External>())));
476489
callback(property, cbinfo);
477490
}
478491

@@ -489,8 +502,8 @@ void PropertySetterCallbackWrapper(
489502
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
490503
PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
491504
reinterpret_cast<intptr_t>(
492-
obj->GetInternalField(kPropertySetterIndex)
493-
.As<v8::Value>().As<v8::External>()->Value()));
505+
Nan::GetExternalValue(obj->GetInternalField(kPropertySetterIndex)
506+
.As<v8::Value>().As<v8::External>())));
494507
callback(property, value, cbinfo);
495508
}
496509

@@ -507,8 +520,8 @@ void PropertyEnumeratorCallbackWrapper(
507520
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
508521
PropertyEnumeratorCallback callback =
509522
reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
510-
obj->GetInternalField(kPropertyEnumeratorIndex)
511-
.As<v8::Value>().As<v8::External>()->Value()));
523+
Nan::GetExternalValue(obj->GetInternalField(kPropertyEnumeratorIndex)
524+
.As<v8::Value>().As<v8::External>())));
512525
callback(cbinfo);
513526
}
514527

@@ -524,8 +537,8 @@ void PropertyDeleterCallbackWrapper(
524537
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
525538
PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
526539
reinterpret_cast<intptr_t>(
527-
obj->GetInternalField(kPropertyDeleterIndex)
528-
.As<v8::Value>().As<v8::External>()->Value()));
540+
Nan::GetExternalValue(obj->GetInternalField(kPropertyDeleterIndex)
541+
.As<v8::Value>().As<v8::External>())));
529542
callback(property, cbinfo);
530543
}
531544

@@ -541,8 +554,8 @@ void PropertyQueryCallbackWrapper(
541554
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
542555
PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
543556
reinterpret_cast<intptr_t>(
544-
obj->GetInternalField(kPropertyQueryIndex)
545-
.As<v8::Value>().As<v8::External>()->Value()));
557+
Nan::GetExternalValue(obj->GetInternalField(kPropertyQueryIndex)
558+
.As<v8::Value>().As<v8::External>())));
546559
callback(property, cbinfo);
547560
}
548561

@@ -560,8 +573,8 @@ v8::Intercepted IndexGetterCallbackWrapper(
560573
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
561574
IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
562575
reinterpret_cast<intptr_t>(
563-
obj->GetInternalField(kIndexPropertyGetterIndex)
564-
.As<v8::Value>().As<v8::External>()->Value()));
576+
Nan::GetExternalValue(obj->GetInternalField(kIndexPropertyGetterIndex)
577+
.As<v8::Value>().As<v8::External>())));
565578
return callback(index, cbinfo);
566579
}
567580

@@ -578,8 +591,8 @@ v8::Intercepted IndexSetterCallbackWrapper(
578591
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
579592
IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
580593
reinterpret_cast<intptr_t>(
581-
obj->GetInternalField(kIndexPropertySetterIndex)
582-
.As<v8::Value>().As<v8::External>()->Value()));
594+
Nan::GetExternalValue(obj->GetInternalField(kIndexPropertySetterIndex)
595+
.As<v8::Value>().As<v8::External>())));
583596
return callback(index, value, cbinfo);
584597
}
585598

@@ -597,8 +610,8 @@ void IndexGetterCallbackWrapper(
597610
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
598611
IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
599612
reinterpret_cast<intptr_t>(
600-
obj->GetInternalField(kIndexPropertyGetterIndex)
601-
.As<v8::Value>().As<v8::External>()->Value()));
613+
Nan::GetExternalValue(obj->GetInternalField(kIndexPropertyGetterIndex)
614+
.As<v8::Value>().As<v8::External>())));
602615
callback(index, cbinfo);
603616
}
604617

@@ -614,8 +627,8 @@ void IndexSetterCallbackWrapper(
614627
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
615628
IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
616629
reinterpret_cast<intptr_t>(
617-
obj->GetInternalField(kIndexPropertySetterIndex)
618-
.As<v8::Value>().As<v8::External>()->Value()));
630+
Nan::GetExternalValue(obj->GetInternalField(kIndexPropertySetterIndex)
631+
.As<v8::Value>().As<v8::External>())));
619632
callback(index, value, cbinfo);
620633
}
621634

@@ -634,9 +647,9 @@ void IndexEnumeratorCallbackWrapper(
634647
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
635648
IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(
636649
reinterpret_cast<intptr_t>(
637-
obj->GetInternalField(
650+
Nan::GetExternalValue(obj->GetInternalField(
638651
kIndexPropertyEnumeratorIndex)
639-
.As<v8::Value>().As<v8::External>()->Value()));
652+
.As<v8::Value>().As<v8::External>())));
640653
callback(cbinfo);
641654
}
642655

@@ -653,8 +666,9 @@ v8::Intercepted IndexDeleterCallbackWrapper(
653666
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
654667
IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
655668
reinterpret_cast<intptr_t>(
656-
obj->GetInternalField(kIndexPropertyDeleterIndex)
657-
.As<v8::Value>().As<v8::External>()->Value()));
669+
Nan::GetExternalValue(obj->GetInternalField(
670+
kIndexPropertyDeleterIndex)
671+
.As<v8::Value>().As<v8::External>())));
658672
return callback(index, cbinfo);
659673
}
660674

@@ -669,8 +683,8 @@ v8::Intercepted IndexQueryCallbackWrapper(
669683
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
670684
IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
671685
reinterpret_cast<intptr_t>(
672-
obj->GetInternalField(kIndexPropertyQueryIndex)
673-
.As<v8::Value>().As<v8::External>()->Value()));
686+
Nan::GetExternalValue(obj->GetInternalField(kIndexPropertyQueryIndex)
687+
.As<v8::Value>().As<v8::External>())));
674688
return callback(index, cbinfo);
675689
}
676690

@@ -685,8 +699,9 @@ void IndexDeleterCallbackWrapper(
685699
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
686700
IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
687701
reinterpret_cast<intptr_t>(
688-
obj->GetInternalField(kIndexPropertyDeleterIndex)
689-
.As<v8::Value>().As<v8::External>()->Value()));
702+
Nan::GetExternalValue(obj->GetInternalField(
703+
kIndexPropertyDeleterIndex)
704+
.As<v8::Value>().As<v8::External>())));
690705
callback(index, cbinfo);
691706
}
692707

@@ -701,8 +716,8 @@ void IndexQueryCallbackWrapper(
701716
cbinfo(info, obj->GetInternalField(kDataIndex).As<v8::Value>());
702717
IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
703718
reinterpret_cast<intptr_t>(
704-
obj->GetInternalField(kIndexPropertyQueryIndex)
705-
.As<v8::Value>().As<v8::External>()->Value()));
719+
Nan::GetExternalValue(obj->GetInternalField(kIndexPropertyQueryIndex)
720+
.As<v8::Value>().As<v8::External>())));
706721
callback(index, cbinfo);
707722
}
708723

nan_callbacks_pre_12_inl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,10 @@ class PropertyCallbackInfo<v8::Integer> :
287287
}
288288
};
289289

290+
inline void* GetExternalValue(v8::Local<v8::External> ext) {
291+
return ext->Value();
292+
}
293+
290294
namespace imp {
291295
template<typename T>
292296
class ReturnValueImp : public ReturnValue<T> {

0 commit comments

Comments
 (0)