Публичный API V8
Этот документ обсуждает стабильность публичного API V8 и как разработчики могут вносить изменения в него.
Стабильность API
Если V8 в версии Chromium canary оказывается нестабильным, он откатывается к версии V8 предыдущего canary. Поэтому важно поддерживать совместимость API V8 от одной версии canary к другой.
Мы постоянно запускаем бота, который сигнализирует о нарушениях стабильности API. Он компилирует Chromium HEAD с текущей canary версией V8.
Сбои этого бота на данный момент только для информации (FYI), и никакие действия не требуются. Список виновных может быть использован для легкой идентификации зависимых CL в случае отката.
Если вы нарушите работу этого бота, помните, что необходимо увеличить окно между изменением в V8 и соответствующим изменением в Chromium в следующий раз.
Как изменить публичный API V8
V8 используется многими различными интеграторами: Chrome, Node.js, gjstest и др. При изменении публичного API V8 (в основном, файлы в каталоге include/
) необходимо гарантировать, что интеграторы смогут плавно обновиться до новой версии V8. В частности, нельзя предполагать, что интегратор обновится до новой версии V8 и одновременно адаптирует свой код к новому API в одной атомарной операции.
Интегратор должен иметь возможность адаптировать свой код к новому API и при этом использовать предыдущую версию V8. Все следующие инструкции основаны на этом правиле.
-
Добавление новых типов, констант и функций безопасно с одной оговоркой: не добавляйте новую чисто виртуальную функцию в существующий класс. Новые виртуальные функции должны иметь стандартную реализацию.
-
Добавление нового параметра в функцию безопасно, если параметр имеет стандартное значение.
-
Удаление или переименование типов, констант, функций небезопасно. Используйте макросы
V8_DEPRECATED
иV8_DEPRECATE_SOON
, которые вызывают предупреждения на этапе компиляции, когда интегратор вызывает устаревшие методы. Например, предположим, мы хотим переименовать функциюfoo
вbar
. Тогда необходимо выполнить следующие шаги:- Добавьте новую функцию
bar
рядом с существующей функциейfoo
. - Дождитесь, пока CL попадет в Chrome. Адаптируйте Chrome для использования
bar
. - Аннотируйте
foo
с помощьюV8_DEPRECATED("Используйте bar вместо этого") void foo();
- В том же CL измените тесты, использующие
foo
, для работы сbar
. - Напишите в CL мотивацию изменения и инструкции для обновления на высоком уровне.
- Дождитесь следующей ветки V8.
- Удалите функцию
foo
.
V8_DEPRECATE_SOON
является более мягкой версиейV8_DEPRECATED
. Chrome не сломается с ним, поэтому шаг b не нужен.V8_DEPRECATE_SOON
недостаточен для удаления функции.Вам все равно нужно аннотировать с помощью
V8_DEPRECATED
и дождаться следующей ветки перед удалением функции.V8_DEPRECATED
можно протестировать с использованием флага GNv8_deprecation_warnings
.V8_DEPRECATE_SOON
можно протестировать с использованиемv8_imminent_deprecation_warnings
. - Добавьте новую функцию
-
Изменение сигнатур функций небезопасно. Используйте макросы
V8_DEPRECATED
иV8_DEPRECATE_SOON
, как описано выше.
Мы ведем документ, упоминающий важные изменения API для каждой версии V8.
Также существует регулярно обновляемая документация doxygen API.