[P2] Compiler: Array.prototype.flat reads arguments indices before evaluating depth
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
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de nickna/SharpTS
-
Dificultad 3/5 1-2 días Aptitud para principiantes 57/100
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 58/100
Los mantenedores suelen responder en 1 día
-
Compiled strict async function declarations lack the throwing callee accessorPosiblemente ocupada @nickna la tomó hoy. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 69/100
Los mantenedores suelen responder en 1 día
Todos los issues de nickna/SharpTS
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
dotnet/wpf#12108 · 3 reacciones ·
Los mantenedores suelen responder en 1 día
-
:watch: Not Triaged dotnet/svc
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
area:build type:chore
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
csharp good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
python triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
microsoft/semantic-kernel#14753 ·
Los mantenedores suelen responder en 5 días