Y no puede llamar de vuelta a JavaScript. Porque eso podría, obviamente, también desencadenar la recolección de basura. Porque no sabes lo que hacen tus funciones de JavaScript. Y así, la idea es, escribes dos implementaciones de una función en C++. Una que es lenta y una que es rápida. Y las llamadas rápidas solo se utilizan después de que V8 detecta que tu código se ha ejecutado muchas veces. Y así, necesita optimizarlo. Quiere optimizarlo. Y recompila tu función de JavaScript que se llamó muchas veces para poder hacer uso de la API rápida. Y una cosa particular que vale la pena mencionar sobre esto es que V8, nuevamente, es un software muy inteligente. Puede hacer esto de manera asíncrona.
Así que, como, puede tomar tu código de JavaScript, notar que se ha llamado muchas veces, notar que debería ser optimizado, pero luego hacer esa optimización en otro hilo en tu aplicación. Así que, como, no detiene la ejecución de tu código. Simplemente, como, dice, hey, esta función necesita ser optimizada, recompílala, pásala a otro hilo. Y una vez que haya terminado, comienza a usar esa nueva implementación de tu función. Súper inteligente, realmente, si piensas en ello. Y así, volvemos al ejemplo de antes, y miramos esto, y todo se junta, ¿verdad?
Así que, como, la razón por la que esto sucede después de un número inestable de iteraciones y solo después de un montón de ellas es que esta función, este buffer.from en este caso, necesita ser llamada muchas veces para hacer que el motor se dé cuenta, hey, vale la pena gastar tiempo en optimizar esto. Vale la pena gastar energía en ello. Porque sucede en un hilo separado, solo sucede después de un número desconocido, pero indeterminista de iteraciones. Así que, definitivamente, de ahí proviene este error. Y así, te dije que hay, como, dos de estas representaciones de cadenas que valen la pena prestar especial atención, ¿verdad? Y así, una de ellas, una cadena de bytes, ese es el nombre de V8 para ISA88591, y la cadena de dos bytes, ese es el nombre de V8 para UTF-16. Y esas son solo, como, las, así que, seis representa secuencial. Así que, esas son las representaciones secuenciales donde una cadena es realmente solo, como, una secuencia de bytes en memoria sin ninguna subcadena especial o corte o, ya saben, concatenación o algo así.
Así que, si miramos nuevamente esta diapositiva de antes, donde miramos la implementación del método de escritura rápida de cadenas, podemos ver, está bien, así que, este método de escritura rápida de cadenas tiene el requisito, el segundo argumento que recibe, es una cadena de un byte. Y si recuerdas la diapositiva anterior, eso significa que es una cadena ISA88591. Y así, copia esto en el destino desde la fuente, desde esta cadena ISA88591, y este método no hace ninguna otra verificación. Así que, si recuerdas, estábamos usando esta implementación para UTF-8 también. Y así, eso no es lo que debería estar haciendo. Simplemente copia literalmente secuencias de bytes de algo que es una cosa a algo que se supone que debe ser otra cosa. Esa es también la razón por la que este error, por ejemplo, no se reprodujo con todos los caracteres.
Comments