V8 QuickIsUndefined 在使用 IsConstructCall 时随机粉碎

V8 QuickIsUndefined crushes randomly when using IsConstructCall

我有一个函数:

auto func = v8::FunctionTemplate::New(context,
    [](const v8::FunctionCallbackInfo<v8::Value>& args) {
        auto isolate = args.GetIsolate();
        if (args.IsConstructCall()) { ... }
        ...
    }).ToLocalChecked();

我公开了这个函数如下。

global->Set(isolate, "func", func);

我将该函数用作普通函数和构造函数,

func();
new func();

和 V8 在 IsConstructCall 被调用时崩溃了。我发现 IsConstructCall 使用 QuickIsUndefined 来检查 NewTarget 是否为 undefined。问题出现在 ReadRawField 内部,它被 GetInstanceType 调用,而 QuickIsUndefined 调用 GetInstanceType.

T=unsigned short开始,我给watch加了reinterpret_cast<unsigned short*>(addr)结果是这样的,和异常说的不一样

更让我迷惑的是,有时候我的程序运行的很好,不卡顿。我使用 v8::UndefinedValue::Equals 而不是 IsContructCall,它运行良好。

!args.NewTarget()->Equals(isolate->GetCurrentContext(), v8::Undefined(isolate)).ToChecked()

似乎QuickIsUndefined有问题,但我无法确定问题所在。在这种情况下有什么帮助?我在单体模式下用 MSVC 编译了 V8。

我遇到了同样的问题: 尝试用 -DV8_COMPRESS_POINTERS 编译你的代码。 V8 现在默认压缩指针。

v8-internal.h "ReadRawField" 可以帮助你了解背景