API pública do V8
Este documento discute a estabilidade da API pública do V8 e como os desenvolvedores podem fazer alterações nela.
Estabilidade da API
Se o V8 em uma versão canário do Chromium acabar sendo problemático e gerar falhas, ele é revertido para a versão anterior do V8. Portanto, é importante manter a compatibilidade da API do V8 de uma versão canário para a próxima.
Executamos continuamente um bot que sinaliza violações de estabilidade da API. Ele compila o HEAD do Chromium com a versão canário atual do V8.
Falhas neste bot atualmente são apenas informativas (FYI) e nenhuma ação é necessária. A lista de culpados pode ser usada para identificar CLs dependentes facilmente em caso de um rollback.
Se você causar uma falha neste bot, lembre-se de aumentar o intervalo entre uma alteração no V8 e uma alteração dependente no Chromium da próxima vez.
Como alterar a API pública do V8
O V8 é usado por vários incorporadores diferentes: Chrome, Node.js, gjstest, etc. Ao alterar a API pública do V8 (basicamente os arquivos no diretório include/), precisamos garantir que os incorporadores possam atualizar suavemente para a nova versão do V8. Em particular, não podemos supor que um incorporador atualize para a nova versão do V8 e ajuste seu código para a nova API em uma única alteração atômica.
O incorporador deve ser capaz de ajustar seu código à nova API enquanto ainda utiliza a versão anterior do V8. Todas as instruções abaixo seguem esta regra.
-
Adicionar novos tipos, constantes e funções é seguro com uma ressalva: não adicione uma nova função puramente virtual a uma classe existente. Novas funções virtuais devem ter implementação padrão.
-
Adicionar um novo parâmetro a uma função é seguro se o parâmetro tiver um valor padrão.
-
Remover ou renomear tipos, constantes e funções é inseguro. Use as macros
V8_DEPRECATEDeV8_DEPRECATE_SOON, que causam avisos de tempo de compilação quando os métodos obsoletos são chamados pelo incorporador. Por exemplo, suponha que queremos renomear a funçãofoopara a funçãobar. Então precisamos fazer o seguinte:- Adicionar a nova função
barpróxima à função existentefoo. - Esperar até que o CL seja incorporado no Chrome. Ajustar o Chrome para usar
bar. - Anotar
foocomV8_DEPRECATED("Use bar em vez disso") void foo(); - No mesmo CL, ajustar os testes que utilizam
foopara usarbar. - Escrever no CL a motivação para a alteração e instruções gerais para atualização.
- Esperar até o próximo branch do V8.
- Remover a função
foo.
V8_DEPRECATE_SOONé uma versão mais leve deV8_DEPRECATED. O Chrome não falhará com ele, então o passo b não é necessário.V8_DEPRECATE_SOONnão é suficiente para remover a função.Ainda é necessário anotar com
V8_DEPRECATEDe esperar pelo próximo branch antes de remover a função.V8_DEPRECATEDpode ser testado usando o flag GNv8_deprecation_warnings.V8_DEPRECATE_SOONpode ser testado usandov8_imminent_deprecation_warnings. - Adicionar a nova função
-
Alterar assinaturas de funções é inseguro. Use as macros
V8_DEPRECATEDeV8_DEPRECATE_SOONcomo descrito acima.
Mantemos um documento mencionando alterações importantes na API para cada versão do V8.
Também há uma documentação da API do doxygen atualizada regularmente.