Добро пожаловать в другие главы Давайте разберемся с 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]