可変引数のバグ修正
[rubycocoa-devel:376]。ちょっと前に rubycocoa-talk での議論中に Jonathan が発見したバグを修正。
ruby では、引数が可変のときに Method#arity は負の数を返すのだけど、そこの処理がうまくないために Objective-C 側から Ruby のメソッドを呼び出すとクラッシュした。もちっと詳しく説明すると
- Time#now を Objective-C から呼び出し
- これは Ruby のオブジェクトなので RBObject#forwardInvocation: が呼ばれる
- NSMethodSignature の取得時にこのバグが影響して、メソッドのタイプ情報が "@@:@" (引数 1コあり) になる
- 引数を取り出そうとしたときに、実際には引数は渡されていないので、メモリのへんな場所にアクセスしてクラッシュ(これが Jonathan が 「[time now:nil] とすればクラッシュしない」と言っていた理由)
今回の件は直したからいいけど、Objective-C 側からの 可変引数をもつ Ruby のメソッドの呼び出しが今の実装ではできないってことに気づく。逆の Ruby -> Objective-C ができないのは知ってて、それを調べてたときにそんな予感はしてたけどニーズがないのでちゃんと調べてなかった。実際あまりニーズはないと思うけど、true/false のスイッチ系のメソッドは使いたいかもなあ。
この件はいくつか対応策は考えてはみているのだけど、その話はまたこんど。