Как можно использовать знаки % в идентификаторах

При просмотре дерева v8 в каталоге src было несколько файлов js, предоставляющих базовые возможности JS. такие объекты, как Math, Array и т. д. Просматривая эти файлы, я видел идентификаторы, включающие знак процента (%) в их именах, то есть %Foo. Сначала я наивно думал, что это какой-то другой разрешенный символ в идентификаторах JS, но когда я попробовал его в оболочке, он наорал на меня, говоря, что я нарушаю правила синтаксиса. Но если это синтаксическая ошибка, то почему работает d8? Вот пример из фактического исходного кода:

src/apinatives.js, строки с 44 по 47, клон git из github/v8/v8

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

src/apinatives.js, строки с 41 по 43, клон git из github/v8/v8

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

Почему эти идентификаторы не приводят к синтаксическим ошибкам. Все файлы js, включая math.js, string.js и все остальные?:wq


person Community    schedule 13.02.2013    source источник
comment
% — это оператор модуля; это что-то тестирует, хотя я не уверен, что именно.   -  person David says reinstate Monica    schedule 14.02.2013
comment
@DavidThomas Почему !%IsTemplate(data)   -  person    schedule 14.02.2013
comment
То, что он делает, зависит именно от того, что возвращается от IsTemplate(data).   -  person David says reinstate Monica    schedule 14.02.2013
comment
Затем требуется, чтобы модуль был унарным оператором, поэтому !%2 должен быть допустимым, что при попытке в консоли приводит к синтаксической ошибке.   -  person    schedule 14.02.2013
comment
Я считаю, что этот файл предварительно обрабатывается макросом или чем-то еще перед компиляцией.   -  person bfavaretto    schedule 14.02.2013


Ответы (1)


Это технически недействительный JavaScript. Это вызовы функций времени выполнения V8. С этой страницы:

Большая часть библиотеки JavaScript реализована в самом коде JavaScript с использованием минимального набора функций времени выполнения C++, которые можно вызывать из JavaScript. Некоторые из них вызываются с использованием имен, начинающихся с %, и с использованием флага «--allow-natives-syntax». Другие вызываются только кодом, сгенерированным генераторами кода, и не видны в JS, даже при использовании синтаксиса %.

Если вы посмотрите parser.cc, вы увидите некоторый код, относящийся к allow_natives_syntax, который определяет, примет ли синтаксический анализатор это расширение языка JavaScript, которое V8 использует для взаимодействия со своей средой выполнения. Эти файлы должны быть проанализированы с включенной опцией.

Я бы предположил, что V8 не позволяет вам делать эти вызовы по умолчанию, потому что это противоречит стандарту JavaScript и потому, что это, вероятно, позволит вам делать то, что вы не должны делать во время выполнения.

person Samuel Edwin Ward    schedule 13.02.2013