какие функции будут вызываться в исходном коде v8 при запуске следующего кода JavaScript:
var x = new Number(1);
В каких файлах эти функции?
Я хочу отследить или отладить исходный код движка V8. Какие функции в этом исходном коде будут вызываться при выполнении или интерпретации кода JavaScript.
Короче говоря: "да" :-)
Я имею в виду: вся V8 существует для выполнения JavaScript (и WebAssembly). Поэтому, когда вы выполняете JS, рано или поздно будут вызываться функции в V8 — более или менее все из них.
Подробное описание на уровне функций того, как работает весь V8 (интерпретатор, различные компиляторы, встроенные функции и т. д.), слишком много для одного ответа SO; на самом деле это больше, чем знает любой человек. Просто прочитайте или проследите/пройдитесь по частям источника, которые вас интересуют прямо сейчас.
Один из способов начать: добавьте %SystemBreak();
в свой фрагмент JS, запустите d8
с --allow-natives-syntax
в отладчике, таком как GDB, дождитесь достижения точки останова и начните действовать оттуда.
Или, если у вас уже есть приблизительное представление о том, что вы ищете, установите точку останова с помощью отладчика. Например, если вы хотите знать, как именно потребляется исходный код, найдите место в d8.cc
, где читается входной файл, и посмотрите, куда он оттуда вытекает.
@Leoqiao Интерпретатор вызывает функции C++ для некоторых операций, а не для всех. Для некоторых операций существует как быстрый путь для распространенных/простых ситуаций, так и запасной вариант C++ для всего остального. Чтобы нажать Intl::ConvertToLower
, попробуйте вызвать .toLocaleLowerCase()
с достаточно сложной строкой и/или локалью, например "I".toLocaleLowerCase("tr")
должен это сделать. Выяснить, что и когда вызывается, конечно, нетривиально; Один полезный трюк — поиск использования Runtime::kStringToLowerCaseIntl
(и подобных констант) на source.chromium.org.
Ваш ответ очень полезен! Вызывает ли интерпретатор соответствующую встроенную функцию (написанную на C++)? В целях отладки я создал движок v8 и установил точку останова в теле функции Intl::ConvertToLower(). Почему я не могу прерваться здесь при запуске кода JavaScript «test».toLowerCase()? Если я не могу отслеживать/отлаживать собственный код, как мне узнать, какие собственные функции вызываются?