C# codegen: generated `Equals(object)` on `[SpacetimeDB.Type]` structs recurses forever
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 72/100
Línea de trabajo
El error está en el generador de código fuente de C# en crates/bindings-csharp/BSATN.Codegen/Type.cs, alrededor de las líneas 809-818, donde el override Equals(object) generado para structs llama a Equals(that_) sobre un Nullable y se recursiona. Empieza leyendo el código del emisor y luego reproduce el problema con el struct Cell y el ejemplo Equals(a, b) del issue. Está terminado cuando el override generado desenvuelve el valor nullable, por ejemplo llamando a Equals(that_.Value), y el reducer deja de desbordar la pila.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Version: SpacetimeDB.Runtime 2.11.*, still on master e596513
Where: crates/bindings-csharp/BSATN.Codegen/Type.cs ~L809-818
public override bool Equals(object? that) {
if (that == null) return false;
var that_ = that as VoipCellCoord?; // for structs this is Nullable<T>
if (((object?)that_) == null) return false;
return Equals(that_); // binds to Equals(object?) again → infinite recursion
}
Repro:
[SpacetimeDB.Type] public partial struct Cell { public int X; public int Y; }
[SpacetimeDB.Reducer]
public static void Repro(ReducerContext ctx) {
Cell a = new() { X = 1 }; Cell? b = new Cell { X = 1 };
var same = Equals(a, b); // object.Equals → Cell.Equals(object) → stack overflow, wasm trap
}
Actual: the reducer traps with a deep recursion through VoipCellCoord__Equals_0 (RhBox at the bottom). Anything
that goes through Equals(object) is affected: object.Equals, EqualityComparer<T>.Default on boxed values,
collections of boxed structs.
Fix: for structs, return Equals(that_.Value); (or that is T t && Equals(t)).
- Lenguaje dominante
- Rust
- Estrellas
- 25.3k
- Forks
- 1.1k
- Merge medio
- 4 d 4 h
- PR fusionados (30 d)
- 53
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Sin guía de contribución
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 clockworklabs/SpacetimeDB
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
clockworklabs/SpacetimeDB#6146 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
clockworklabs/SpacetimeDB#6127 ·
Los mantenedores suelen responder en 1 día
-
TS SDK: `Result` errors are serialized with the `ok` type (instance crash)Quizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
clockworklabs/SpacetimeDB#6122 ·
Los mantenedores suelen responder en 1 día
-
CI flake: LintsAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
clockworklabs/SpacetimeDB#5985 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
clockworklabs/SpacetimeDB#5943 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de clockworklabs/SpacetimeDB
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
bytecodealliance/rustix#1703 ·
Los mantenedores suelen responder en 3 días
-
bug discussion
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
medialab/xan#1201 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
farion1231/cc-switch#8298 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
ajeetdsouza/zoxide#1323 ·
Los mantenedores suelen responder en 1 día