c++ - V8 QuickIsUndefined 在使用 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
,我添加reinterpret_cast<unsigned short*>(addr)
到手表上,结果是这样的,和异常所说的不同。
更让我困惑的是,有时我的程序运行良好而不会崩溃。而不是IsContructCall
,我使用v8::Undefined
and Value::Equals
,它运行良好。
!args.NewTarget()->Equals(isolate->GetCurrentContext(), v8::Undefined(isolate)).ToChecked()
似乎QuickIsUndefined
有一些问题,但我无法确定问题所在。在这种情况下有什么帮助?我在单体模式下使用 MSVC 编译了 V8。
解决方案
我遇到了同样的问题:尝试使用 -DV8_COMPRESS_POINTERS 编译您的代码。V8 现在默认压缩指针。
v8-internal.h "ReadRawField" 可以帮助你了解背景
推荐阅读
- macos - 在 Mac OS X 上使用快捷键关闭当前 WebStorm 实例?
- c# - Git,一个解决方案中的两个存储库
- android - 如何在android中播放m3u文件?
- api - 从 openshift 调用 API 的 IP/主机名白名单方式
- javascript - 修复了滚动时的侧边栏,然后在向上滚动时恢复正常
- scala - Spark reduce 功能导致“错误类型不匹配”
- java - Java - 强制/警告不推荐使用的注释没有链接(或不推荐使用的链接)
- php - 不删除 codeigniter 中的 index.php
- matlab - 使用二分法找到第一类贝塞尔函数 (J0(x)) 的第 n 个根
- javascript - Javascript/NodeJS:在 forEach 内完成 .find 之前的 html 渲染