2007-03-01から1ヶ月間の記事一覧

Module#class_eval でメソッド定義するときのローカルスコープ

前回のまとめ(*) でこう書いた。 exec_under() は、クラス A を現在の cref スタックに追加した新たな cref スタックを、lfp[-1] すなわちローカル変数領域の内部用特別領域に保管する。このローカル変数のスコープが何かについては、今回は調べていない。 …

クラスメソッドからクラス変数を参照 - class_eval で定義されたクラスメソッドの場合 (ruby 1.9) [その2]

Module#class_eval で定義されたクラスメソッドの命令列の cref スタックは、通常の場合と違いlfp_get_special_cref() で返される cref スタックとなる。 lfp_get_special_cref() は他のクラスメソッド定義のやり方のときは値を返さなかったので、Module#cla…

クラスメソッドからクラス変数を参照 - class_eval で定義されたクラスメソッドの場合 (ruby 1.9) [その1]

前回「最後のパターン」などと書いたが、ドラえもんや巨人の星で分かる通り、「最後」というのは当てにならない。ということで、今回もクラスメソッドとクラス変数の話が続く。 今回は Module#class_eval の中で定義したクラスメソッドの中からクラス変数を…

夏時間切り替え問題

日本でも「3週間早い夏時間切り替えでIT製品に問題多発」などとニュースになっているようだが、アメリカでの夏時間変更のための修正(以下 DST パッチ) 作業は、たしかに予想を越える大変さだった。 会社編 まず、会社ではIT部門、データセンター部門が数週間…

クラスメソッドからクラス変数を参照 - 特異クラス内で定義されたクラスメソッドの場合 (ruby 1.9)

クラスメソッドからクラス変数を参照。最後のパターンは、特異クラス内で定義されたクラスメソッドの場合だ。調べる Ruby のプログラムは以下の通り。 class A @@a = "Hello" end class <<A def test_sclass puts @@a end end A.test_sclass (test_sclass.rb) 特異クラス定義の部分は、どういう VM 命令列になるのだろうか?アセンブリコードを見てみよう。 == disasm: @test_sclass.rb>================================= 0000 putnil 0001 …</a>

トップレベルのクラスが Object でないこともある

昨日コードを調べたとき、一つ気になったことがある。 prepare_iseq_build(rb_iseq_t *iseq, VALUE name, VALUE filename, VALUE parent, VALUE type, VALUE block_opt, const rb_compile_option_t *option) { rb_thread_t *th = GET_THREAD(); ............…

クラスメソッドからクラス変数を参照 - クラス外で定義されたクラスメソッドの場合 (ruby 1.9) [その2]

問題となっている cref は iseq->cref_stack から来ている。どういう経緯でここに Object クラスが設定されたのかを知りたい。 手始めに iseq->cref_stack を初期化しているところを探してみる。cref_stack という文字列でファイル検索をかけると 20 箇所ほ…

クラスメソッドからクラス変数を参照 - クラス外で定義されたクラスメソッドの場合 (ruby 1.9) [その1]

今回は、クラス外で定義されたクラスメソッドからクラス変数を参照する場合の内部動作を調べてみる。Ruby のコードは以下のとおり。 class A @@a = "Hello" end def A.test_out puts @@a end A.test_out 前回やったのと同じ要領で、puts @@a に対応する YARV…

ソマリア人と世間話

タクシーに乗って空港に向かう途中、運転手と世間話をした。 どこの出身か聞くと、7年ほど前にソマリアからアメリカにやってきたと言う。ソマリアというと、内戦で大変なことになっているあの国ではないか。 暫定政府がイスラム勢力を追い出したという、最…