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::Undefined
和 Value::Equals
而不是 IsContructCall
,它运行良好。
!args.NewTarget()->Equals(isolate->GetCurrentContext(), v8::Undefined(isolate)).ToChecked()
似乎QuickIsUndefined
有问题,但我无法确定问题所在。在这种情况下有什么帮助?我在单体模式下用 MSVC 编译了 V8。
我遇到了同样的问题:
尝试用 -DV8_COMPRESS_POINTERS 编译你的代码。 V8 现在默认压缩指针。
v8-internal.h "ReadRawField" 可以帮助你了解背景
我有一个函数:
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::Undefined
和 Value::Equals
而不是 IsContructCall
,它运行良好。
!args.NewTarget()->Equals(isolate->GetCurrentContext(), v8::Undefined(isolate)).ToChecked()
似乎QuickIsUndefined
有问题,但我无法确定问题所在。在这种情况下有什么帮助?我在单体模式下用 MSVC 编译了 V8。
我遇到了同样的问题: 尝试用 -DV8_COMPRESS_POINTERS 编译你的代码。 V8 现在默认压缩指针。
v8-internal.h "ReadRawField" 可以帮助你了解背景