[P2] Compiler: Array.prototype.flat reads arguments indices before evaluating depth

Cerrado
#3,535 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Ya se ha fusionado un pull request relacionado.

  • #3510 de @nickna — fusionado

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
52/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
csharp, typescript
Área
compilers

Línea de trabajo

Start by reading the inline Array.prototype.flat dispatch and the mapped arguments changes in #3510; compare their evaluation order with JavaScript’s call argument evaluation. Compile the sample as an unchecked classic .js program using --no-tsconfig --noLib --verify and check the trace against Node v22.23.2. Done means the depth expression runs before indexed access, while the result remains 7.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

An indexed arguments accessor runs before the depth expression when compiled JavaScript invokes Array.prototype.flat.call. JavaScript evaluates the call arguments before entering the builtin.

function run(first) {
    const args = arguments;
    const trace = [];
    Object.defineProperty(args, "0", { get() { trace.push("index"); return 7; } });
    const result = Array.prototype.flat.call(args, (trace.push("depth expression"), 1));
    console.log(result.join(","), trace.join(","));
}
run(1);

Node v22.23.2 prints 7 depth expression,index. The compiler with the mapped arguments changes in #3510 prints 7 index,depth expression and passes full saved IL verification. Clean main at cabb41636 prints an empty result with depth expression, since the former arguments snapshot skipped indexed accessors entirely. Compile the sample as an unchecked classic .js program with --no-tsconfig --noLib --verify.

Inline flat prepares its array-like input before evaluating the depth expression. The mapped arguments work makes indexed accessors observable, which exposes this pre-existing dispatch order. Related to #3533, which covers duplicate length reads.

Lenguaje dominante
C#
Estrellas
156
Forks
4
Merge medio
15 h 35 min
PR fusionados (30 d)
43

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de nickna/SharpTS

Todos los issues de nickna/SharpTS

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.