Добро пожаловать в другие главы Давайте разберемся с Chrome V8

Структура данных, которая сохраняет байт-коды, называется SharedFunction, а SharedFunction, связанная с контекстом, — JSFunction. В чем разница? На мой взгляд, SharedFunction подобна DLL, общей библиотеке, которая может совместно использоваться несколькими программами; и JSFunction — это конкретная исполняемая программа. В этой статье мы поговорим о коде JSFunction и структуре памяти.

1. Код JSFunction

Ниже приведено определение JSFunction:

В строках с 5 по 7 определены три члена индекса, которые являются статическими членами и применяются ко всем экземплярам SharedFunction. Строки 10, 11 и 12 связывают контекст и глобальный получатель. Строка 17 связывает InterpreterEntryTrampoline, которая является точкой входа для выполнения байт-кода. Строки с 18 по 45 определяют функции оптимизации и деоптимизации, которые используются в TurboFan. Давайте поговорим о процессе новой JSFunction.

(1) Создайте SharedFunction и установите байт-код

При создании нового экземпляра JSFunction нам нужно сначала создать экземпляр SharedFunction. Важным шагом при создании экземпляра SharedFunction является установка байт-кода, см. строку 13 приведенного выше кода.

(2) Новая функция JSFunction

В приведенном ниже коде вы увидите, что создание JS — это процесс привязки SharedFunction и контекста.

Строка 2 приведенного выше кода приводит это к SharedFunctionInfo (изначально это SharedFunctionInfo). В строке 5 вызовите NewFunctionFromSharedFunctionInfo, чтобы создать JSFunction. Примечание: его параметры — S и C, см. строку 11. Наконец, вызовите NewFunction, которая приведена ниже.

9-я и 11-я строки кода выше устанавливают SharedFunctionInfo и контекст в соответствующие позиции, что является привязкой, упомянутой выше.

Что такое GetCode в строке 10? См. ниже.

Наш тестовый пример (см. Главу 4) — это массив байт-кода, поэтому возвращаемое значение GetCode равно kInterpreterEntryTrampoline. Роль GetCode — вернуть метод входа в соответствии с типом SharedFunctionInfo, который используется для перехода к соответствующему байт-коду и его выполнения (см. Глава 8).

Подводя итог, при создании JS нам важны тип байт-кода, контекст и метод ввода, а остальные не важны. На рис. 1 показан стек вызовов.

2. Структура памяти JSFunction

JSFunction — это управляемый кучей объект V8, который использует смещения памяти для представления внутренних элементов. Код ниже:

TORQUE_GENERATED_JSFUNCTION_FIELDS определяет смещение всех членов, а StartOffset — это базовый адрес. V8 читает и записывает элементы по StartOffset+offset. Возьмите set_code в качестве примера для объяснения, код ниже.

Шаблон макроса RELAXED_WRITE_FIELD приведен ниже.

Вышеупомянутые два Relaxed_Store реализуют операцию записи set_code. На рис. 2 показан стек вызовов.

Операция чтения такая же, как и запись, упомянутая выше. Байты считываются со смещения и преобразуются в ожидаемый тип. Код ниже, пожалуйста, проанализируйте его самостоятельно.

Кстати, Relaxed_Load — это базовый метод, который часто используется, когда V8 управляет объектами кучи.

Хорошо, на этом мы закончили. Увидимся в следующий раз, берегите себя!

Мой блог cncyclops.com. Пожалуйста, свяжитесь со мной, если у вас есть какие-либо проблемы.

WeChat: qq9123013 Электронная почта: [email protected]