gin_helper::MicrotasksScope的构造函数是这样声明的:
explicit MicrotasksScope(v8::Isolate* isolate,
v8::MicrotaskQueue* microtask_queue,
bool ignore_browser_checkpoint = false,
v8::MicrotasksScope::Type scope_type =
v8::MicrotasksScope::kRunMicrotasks);
在2eb3bdd(#29058)中添加了scope_type
参数。
v8::MicrotasksScope是一个enum
,而不是一个enum class
:
enum Type { kRunMicrotasks, kDoNotRunMicrotasks };
我们有很多地方错误地使用v8::MicrotasksScope::Type作为第三个参数示例化。我很惊讶这能编译;但是既然v8::MicrotasksScope::Type
被声明为一个enum
而不是一个enum class
,我的猜测是编译器正在隐式地将Type
转换为一个bool
?
示例:
shell/common/v8_value_serializer.cc
37: gin_helper::MicrotasksScope microtasks_scope(
38- isolate_, isolate_->GetCurrentContext()->GetMicrotaskQueue(),
39- v8::MicrotasksScope::kDoNotRunMicrotasks);
shell/common/node_bindings.cc
286: gin_helper::MicrotasksScope microtasks_scope(
287- isolate, env->context()->GetMicrotaskQueue(),
288- v8::MicrotasksScope::kDoNotRunMicrotasks);
shell/renderer/api/electron_api_spell_check_client.cc
223: gin_helper::MicrotasksScope microtasks_scope(
224- isolate_, context->GetMicrotaskQueue(),
225- v8::MicrotasksScope::kDoNotRunMicrotasks);
因此,这些MicrotasksScopes被用错误的标志和错误的类型示例化。这引发了几个问题:
- 这段代码实际上起作用了吗?
- 如果它起作用了,是因为这些示例化并不是必要的吗?
- 如果它不起作用,为什么我们没有早点发现?我们没有覆盖这段代码的测试吗?
CC @deepak1556,他没有引入这个bug,但他可能对何时使用gin_helper::MicrotasksScope
有最多的上下文
关于gin_helper::MicrotasksScope
的背景信息: #24131
2条答案
按热度按时间ix0qys7i1#
哦,哇,感谢注意到这个问题!您关于隐式转换 https://godbolt.org/z/hjf73GWfv 的看法是正确的。
这段代码实际上有效吗?
我认为不是,无论是在浏览器进程还是渲染进程中,我们都在执行与调用站点意图相反的操作。
如果它不起作用,为什么我们没有早点发现?我们没有覆盖这段代码的测试吗?
我想我们是幸运的,V8 侧的检查只影响有限的微任务,例如 https://source.chromium.org/chromium/chromium/src/+/main:v8/src/api/api-inl.h;l=205-213 。大多数情况下的调用站点将采用显式模式,当无法运行微任务时,它将不执行任何操作。我们的测试应该改进以捕获这些情况。
efzxgjgh2#
我偶然发现了这个,因为我在查看我们示例化
gin_helper::MicrotasksScope
的地方,以便更好地理解它。我理解它的实现在做什么,但不完全理解何时使用它以及何时不使用它。有没有一种启发式方法可以说 "啊,我们需要在这里添加我们的微任务范围"?