C# codegen: generated `Equals(object)` on `[SpacetimeDB.Type]` structs recurses forever
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
バグは C# ソースジェネレーターの crates/bindings-csharp/BSATN.Codegen/Type.cs の809〜818行目付近にあります。struct 向けに生成される Equals(object) のオーバーライドが、Nullable に対して Equals(that_) を呼び出し、再帰してしまいます。まずこのエミッターのコードを読み、その後 issue の Cell struct と Equals(a, b) の例で再現してください。生成されたオーバーライドが、たとえば Equals(that_.Value) を呼び出して nullable の値をアンラップし、reducer がスタックオーバーフローを起こさなくなれば完了です。
索引モデルが issue の本文から書いたものです。
説明
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)).
- 主要言語
- Rust
- スター
- 25.3k
- フォーク
- 1.1k
- 平均マージ
- 4日 6時間
- マージ済み PR(30日)
- 43
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
clockworklabs/SpacetimeDB のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
clockworklabs/SpacetimeDB#6146 ·
メンテナーはふだん 1 日以内に返信
-
TS SDK: `t.result()` is typed `Ok | Err`, but the runtime expects `{ ok } | { err }`対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
clockworklabs/SpacetimeDB#6127 ·
メンテナーはふだん 1 日以内に返信
-
TS SDK: `ctx.http.fetch` throws for status codes the `statuses` package doesn't know対応中かも @kshanxs が 2 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
clockworklabs/SpacetimeDB#6126 ·
メンテナーはふだん 1 日以内に返信
-
TS SDK: `ctx.http.fetch` splits header values that contain commas対応中かも @kshanxs が 2 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
clockworklabs/SpacetimeDB#6123 ·
メンテナーはふだん 1 日以内に返信
-
TS SDK: `Result` errors are serialized with the `ok` type (instance crash)対応中かも @Tyagiquamar が 2 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
clockworklabs/SpacetimeDB#6122 ·
メンテナーはふだん 1 日以内に返信
clockworklabs/SpacetimeDB の issue をすべて見る
似ている issue
-
Add Mimirオープン
難易度 1/5 1時間未満 初心者へのやさしさ 78/100
slavakurilyak/awesome-ai-agents#759 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
compiler-explorer/compiler-explorer#9272 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 63/100
pop-os/cosmic-files#2117 ·
メンテナーはふだん 2 日以内に返信
-
L: java:gradle L: java:maven L: ruby:bundler T: bug 🐞
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
dependabot/dependabot-core#16547 ·
メンテナーはふだん 1 日以内に返信
-
bug status:ready-for-test
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
UniClipboard/UniClipboard#1985 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信