为什么某些函数调用在 v8 源的 JS 文件中前面有一个 %

Why are some of the function invocations preceded by a % in JS files for v8 source?

本文关键字:文件 前面 有一个 JS 源的 函数调用 v8 为什么      更新时间:2023-09-26

我在许多代码中看到%。你能向我解释一下它的目的或它的作用吗?

编辑:我知道数学13 % 10 = 3的操作数,但我看到的就像return %foo

在查看 v8 源文件时遇到此问题

为什么某些函数调用前面带有 % 号?

%CheckIsBootstrapping();
//---
// Only used by async-await.js
function RejectPromise(promise, reason, debugEvent) {
  %PromiseReject(promise, reason, debugEvent);
}
//---
var callbacks = %create_resolving_functions(promise, debugEvent);

根据您在注释中提供的链接,%字符似乎在某些 V8 JavaScript 引擎源代码中使用,以指示将在解析 JavaScript 源代码时执行的C++运行时方法。

例如,字符串中的行.js:

return %StringBuilderConcat(parts, len + 1, "");

当解析器遇到时,将执行StringBuilderConcat方法。您可以在runtime.h中找到可用于V8 JavaScript文件的运行时方法列表(注意,我没有C++的经验,所以据我所知,这与string.js中引用的StringBuilderConcat方法无关,但我认为这是一回事):

#define RUNTIME_FUNCTION_LIST_ALWAYS_1(F) '
  /* Property access */ '
  F(GetProperty, 2, 1) '
  F(KeyedGetProperty, 2, 1) '
  /* ... */
  F(StringBuilderConcat, 3, 1) '
  /* ... */

如前所述,return %foo会在 JavaScript 中抛出一个 SyntaxError。