API pública de V8
Este documento analiza la estabilidad de la API pública de V8 y cómo los desarrolladores pueden realizar cambios en ella.
Estabilidad de la API
Si V8 en una versión canary de Chromium resulta ser inestable, se retrocede a la versión de V8 del canary anterior. Por lo tanto, es importante mantener la API de V8 compatible de una versión canary a la siguiente.
Ejecutamos continuamente un bot que señala violaciones de la estabilidad de la API. Compila el código principal de Chromium con la versión actual canary de V8.
Las fallas de este bot actualmente son solo informativas y no requieren acción. La lista de culpables puede ser utilizada para identificar fácilmente los CL dependientes en caso de un retroceso.
Si rompes este bot, recuerda aumentar el intervalo entre un cambio en V8 y el correspondiente cambio dependiente en Chromium la próxima vez.
Cómo cambiar la API pública de V8
V8 es utilizado por muchos integradores diferentes: Chrome, Node.js, gjstest, etc. Al cambiar la API pública de V8 (básicamente los archivos bajo el directorio include/
) debemos asegurarnos de que los integradores puedan actualizarse sin problemas a la nueva versión de V8. En particular, no podemos asumir que un integrador actualice a la nueva versión de V8 y ajuste su código a la nueva API en un único cambio atómico.
El integrador debe poder ajustar su código a la nueva API mientras aún usa la versión anterior de V8. Todas las instrucciones a continuación se derivan de esta regla.
-
Agregar nuevos tipos, constantes y funciones es seguro con una salvedad: no agregues una nueva función virtual pura a una clase existente. Las nuevas funciones virtuales deben tener una implementación predeterminada.
-
Agregar un nuevo parámetro a una función es seguro si el parámetro tiene un valor predeterminado.
-
Eliminar o renombrar tipos, constantes, funciones no es seguro. Usa los macros
V8_DEPRECATED
yV8_DEPRECATE_SOON
, que generan advertencias en tiempo de compilación cuando los métodos obsoletos son llamados por el integrador. Por ejemplo, supongamos que queremos renombrar la funciónfoo
a la funciónbar
. Entonces necesitamos hacer lo siguiente:- Agregar la nueva función
bar
cerca de la función existentefoo
. - Esperar hasta que el CL entre en Chrome. Ajusta Chrome para usar
bar
. - Anotar
foo
conV8_DEPRECATED("Usa bar en su lugar") void foo();
- En el mismo CL ajustar las pruebas que usan
foo
para que usenbar
. - Escribir en el CL la motivación para el cambio y las instrucciones de actualización a alto nivel.
- Esperar hasta la próxima rama de V8.
- Eliminar la función
foo
.
V8_DEPRECATE_SOON
es una versión más suave deV8_DEPRECATED
. Chrome no se romperá con esto, así que el paso b no es necesario.V8_DEPRECATE_SOON
no es suficiente para eliminar la función.Todavía necesitas anotar con
V8_DEPRECATED
y esperar hasta la próxima rama antes de eliminar la función.V8_DEPRECATED
puede ser probado usando el flag GNv8_deprecation_warnings
.V8_DEPRECATE_SOON
puede ser probado usandov8_imminent_deprecation_warnings
. - Agregar la nueva función
-
Cambiar las firmas de funciones no es seguro. Usa los macros
V8_DEPRECATED
yV8_DEPRECATE_SOON
como se describe arriba.
Mantenemos un documento que menciona cambios importantes en la API para cada versión de V8.
También hay una documentación API doxygen que se actualiza regularmente.