きりかノート 3冊め

おあそびプログラミング

今週のコミット

最近の変更まとめ。

macportsのほうでチケットもらったので対処。

  • インストールスクリプト中にある xargs をフルパスにした。gnu findtoolsが入ってるとうまく動作しないことがあるというレポートをもらったので。
  • configオプションの--target-archsに空文字が渡されたときにビルド失敗する問題を修正。

10.6 Snow Leopardでの残ってる問題を1個なおした。

  • d:id:kimuraw:20090922:p2のNSUndoManagerの件を修正。10.6でもivoke-based undo managementが動くようになった。

これはちょっと複雑なので補足すると、10.6ではNSUndoManager#prepareWithInvocationTarget:がselfでなくプロキシオブジェクトを返すようになった(http://developer.apple.com/mac/library/releasenotes/Cocoa/Foundation.html)ということがある。これは、アンドゥマネージャの制御とアンドゥ操作を区別するための設計じの改善なんだけど、プロキシオブジェクトは「1回だけ」メッセージを転送するようになっている。

これのなにが問題になったかというと、RubyCocoa内部でprepareWithInvocationTarget:から得られたプロキシオブジェクトにrespondsToSelector:メッセージを送るとその1回が終わってしまうのだ。

てきとうに図示するとこんな感じ。

[target]   [manager]    [proxy]
    |          |
    |          +---------->* prepareWithInvocationTarget:
    |          |           |
    |          +---------->| respondsToSelector:
    |<-------- | ----------+ forwardInvocation:
    |          |           |
    |          +---------->| methodSignatureForSelector:
    |          | <- - - - -| (return nil, invokation ticket expired)

respondsToSelector:くらい許してくれよと思うけれど(あとでバグレポート出す)仕方ないので、オブジェクトがNSUndoManagerProxy(非公開クラス)のインスタンスのときだけ特殊処理をするようにした。

  • 32bit版で予期せずSEGVするバグを修正(10.5, 10.6とも)

1.0.0のリリース前にいれた修正(r2234)にひどいまちがいがあった。rb_intern()にVALUEを渡してるとかもうね。


ここまでで、影響のありそうな問題をだいぶ直したので新しいバージョンをリリースするつもり。1.0.0以降の変更は次のとおり。なんか問題を見つけたらお知らせください。