帰省している間、ネットから隔絶されているので、 この機会に「いつか手をつけようと思ってた問題」を片づけよう。
ふたつのオブジェクトのエンコーディングに互換性があるかどうかをチェックする関数 rb_enc_checkだが、Rubyのソースコード全体に19箇所登場しているすべてが ふたつの文字列のエンコーディングを比較していた。
ということは、文字列専用のチェックにすればもっと高速化するのでないだろうか。
そう思って試してみたのだが、 測定する限りでは誤差の範囲内しか効果がないようであった。
US-ASCII文字列は本来7bitの範囲内の文字しか含まないはずなので、 これを利用するとcoderangeチェックが節約できるはず。
と思ったが、測定結果これまた効果なし。
Integer#to_sの結果はいつもUS-ASCIIでcoderangeは7bitに決まっている。 ので、あらかじめ7bitフラグを立てることを考えてみた。 が、よっぽど長い文字列(すごく大きな整数)を取り扱わない限り、差はないようである。
現在、Ruby 1.8の動作とRuby 1.9でClass.dupを行った時の 定数、クラス定数の振る舞いが異なる。
で、1.9の動作(つまり昔の1.8の動作)が正しいと思っていたのだが、 この機会にいろいろ考えてみたら、やっぱり1.8の動作が望ましいが、 現在の1.8にはバグがある(バグを直した動作が「正しい」)ということが 分かった。
で、1.8ではその「バグ」を直したのだが、 問題は1.9でこの挙動をどうやって実現すればよいのかわからないことだ。
かなり長い時間ソースコードを解析して、 Methodが指しているiseqがcref_stackを持っていることが分かったので、 対策としては
などを考えついたが、実際に動かすところまでには持っていけなかった。
今回は時間はかかった(休みだから余裕はあった)が、 成果はほとんどなかった。残念
姪っ子と うちの子供たちを連れて山口市の「ちょうちん祭」にでかける。 今回の帰省の最大の目的でもある。
娘たちの浴衣姿とかとてもかわいらしかった。
人ごみは苦手だけど、祭りならなんとか耐えられるかな。