BitBlt

というねずみはなんだったかというと、今朝書いたBitBltの修正によるものである。Squeakは当たり前のように多倍長整数をサポートしている割には、描画を受け持つ最下層のオブジェクトであるBitBltの実装にいまいちなところがあって、多倍長整数を座標値として持つグラフィカルなものを描画しようとするとこけてしまっていた。今朝になって、自分の才能の無さにいらいらしつつもようやくその修正をしたので、とんでもない座標値を持ったグラフィカルオブジェクトがあってもこけなくなったのである。

普通に文字形式でプログラムを書いているときは、画面上の1ピクセルを1単位とする座標系で多倍長整数が使われてしまうことはなかなかないのだが、タイルスクリプティングなので小学生でもそういう場面が簡単に作れてしまう。単純に座標値に大きな値を入れるだけではなく、

  object's x | increase by | object's x

みたいなスクリプトをタイルで書いてそれを繰り返し実行すれば、あっという間に多倍長整数の世界に突入である。

単純には、SmallIntegerで表現できる値を超えそうになったら値を丸めてしまう、という方針も考えられるが、それではやっぱり面白くない。値そのものはちゃんと正しい値として保持しておいて、レンダリングのときだけ正しくさぼるのが正しいわけだ。

というわけでBitBltを使うやつらはだいたい思ったように動くようになったのだが、SqueakにはBalloon2Dという2次元ベクトルグラフィックスレンダリングエンジンもあって、このねずみのようにベクトルグラフィックスになっているやつはそちらを使うようになっている。その場合、多倍長整数のハンドリングに問題があって、ある線分を一つ描きかかったところでエラーになってしまう。その結果がこの血まみれねずみ、というわけである。