言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

SuperPartsBin のバグ

Error: This Context was not included in the ImageSegment

id:shortsleeved:20050111#p1 で報告のあった SuperPartsBin のバグの話です。実はこのバグ、原因は分かっているのですが起こる状況が色々ありすぎて対策が難しいところです。モーフを保存するときに余分なオブジェクトも巻き添えに保存してしまう事から起こります。典型的には、モーフのプロパティ辞書にワールドへの参照が入っていて、ワールドごとごっそり保存してしまおうとして落ちます。間接的にワールドへの参照があっても駄目です。このあたりの、とりあえず作りが Squeak で僕がいやな部分の一つです。

(他の戦略としては、シリアライズの際に含めるべき参照をプログラマが明示的に指定するべきという物もあると思うが、モーフ保存の戦略は逆に、含めてはいけない物を明示的に指定する事になっている。)

バグの直し方は、デバッガに ReferenceStream(DataStream)>>writeInstance: の行が現れると思うのですが、これが今保存しようとしているオブジェクトで、多分沢山あると思います。これをスタックの根っこの方に辿っていって、ワールドを指し示す辞書にまで行き着くと思うのですが、 (例: #hogehoge -> World) その hogehoge が問題の参照です。もしバグが起こったときめっちゃ暇だったら探してみてください。