如何在标识符中使用百分号符号?

7
在浏览v8代码树下的src目录时,我看到了一些js文件,提供了一些基本的JS对象,如Math、Array等。在浏览这些文件时,我看到它们的名字中包含了百分号(%),例如%Foo。起初我天真地认为这是JS标识符中允许的其他字符,但当我在shell中尝试时,它告诉我违反了语法规则。但如果这是语法错误,为什么d8还能工作呢?以下是实际源代码的示例:

src/apinatives.js第44到47行,在github/v8/v8上使用git clone获得。

function Instantiate(data, name) {
  if (!%IsTemplate(data)) return data;
      var tag = %GetTemplateField(data, kApiTagOffset);
      switch (tag) {

源代码位于 src/apinatives.js 的第 41 至 43 行,可从 github/v8/v8 进行克隆

function SetConstructor() {
  if (%_IsConstructCall()) {
    %SetInitialize(this);

为什么这些标识符不会产生语法错误?包括math.js,string.js和其他所有js文件? :wq

1
%模数运算符; 这是在测试某些东西,但我不确定是什么。 - David Thomas
1
@DavidThomas 为什么 !%IsTemplate(data) - user1621465
它的作用取决于从IsTemplate(data)返回的内容。 - David Thomas
1
然后它要求模运算符成为一元运算符,因此 !%2 应该是有效的,但是在控制台中尝试时,会产生语法错误。 - user1621465
我相信在编译之前,该文件会被宏或其他东西进行预处理。 - bfavaretto
1个回答

20

它在技术上并不是有效的JavaScript。 这些都是对V8 runtime函数的调用。根据此页面

JavaScript库的许多内容都是使用一组最少的可从JavaScript中调用的C ++运行时函数自己实现的。 其中一些使用以%开头的名称调用,并使用标志“--allow-natives-syntax”调用。其他人仅由代码生成器生成的代码调用,即使在JS中也不可见,即使使用%语法也不可见。

如果您查看parser.cc,您可以看到与allow_natives_syntax相关的一些代码,该代码确定解析器是否接受V8正在使用的扩展JavaScript语言与其运行时交互的方法。 必须使用此选项解析这些文件。

我猜测V8默认情况下不允许您进行这些调用,因为它会违反JavaScript标准,并且可能会允许您执行不应该能够执行的运行时操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接