electron [Bug]:gin_helper::MicrotasksScope使用错误的参数进行示例化

bkhjykvo  于 5个月前  发布在  Electron
关注(0)|答案(2)|浏览(43)

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

ix0qys7i

ix0qys7i1#

哦,哇,感谢注意到这个问题!您关于隐式转换 https://godbolt.org/z/hjf73GWfv 的看法是正确的。
这段代码实际上有效吗?
我认为不是,无论是在浏览器进程还是渲染进程中,我们都在执行与调用站点意图相反的操作。
如果它不起作用,为什么我们没有早点发现?我们没有覆盖这段代码的测试吗?
我想我们是幸运的,V8 侧的检查只影响有限的微任务,例如 https://source.chromium.org/chromium/chromium/src/+/main:v8/src/api/api-inl.h;l=205-213 。大多数情况下的调用站点将采用显式模式,当无法运行微任务时,它将不执行任何操作。我们的测试应该改进以捕获这些情况。

efzxgjgh

efzxgjgh2#

我偶然发现了这个,因为我在查看我们示例化 gin_helper::MicrotasksScope 的地方,以便更好地理解它。我理解它的实现在做什么,但不完全理解何时使用它以及何时不使用它。有没有一种启发式方法可以说 "啊,我们需要在这里添加我们的微任务范围"?

相关问题