local_variable_getはどう作る
なんとなくRubyにlocal_variable_get(sym) を作ってみたくなって、Rubyのソースコードを覗いてみた。
Truncの#19354を調べたものの、結論から言うとどこをどう使えばいいかわからず、とっかかりすらつかめなかった。
情けなや。
evalでもいいんだけどね…
local_variable_getで想定した引数は、一つで省略不可能のシンボル。
これを実行すると、変数symbolで示されるローカル変数の値を読み出す。
つまるはevalを使ってあらわすと、
eval "#{:sym}"
と同じ結果が返ってくるようなモノだ。
まぁevalを使えばできるのだけど、それだとパーサ経由になって少々重い。
これがダイレクト変数テーブルから抽出できると、速度向上によっていろいろと変化が起きるんじゃないか…なんて妄想してみた。
ローカル変数ってどこにある?
そこで、ソースコードの探索に出てみる。
ローカル変数を指し示すのはtIDENTIFIERなのだろうけど、それの処理をどこでやっているかわからない。
variable : tIDENTIFIER | tIVAR | tGVAR | tCONSTANT | tCVAR | keyword_nil {ifndef_ripper($$ = keyword_nil);} | keyword_self {ifndef_ripper($$ = keyword_self);} | keyword_true {ifndef_ripper($$ = keyword_true);} | keyword_false {ifndef_ripper($$ = keyword_false);} | keyword__FILE__ {ifndef_ripper($$ = keyword__FILE__);} | keyword__LINE__ {ifndef_ripper($$ = keyword__LINE__);} | keyword__ENCODING__ {ifndef_ripper($$ = keyword__ENCODING__);} ;
としているあたりが怪しそうだけど、そもそもtIDENTIFIERと解釈した直後はどこにいくのだろう。
tIDENTIFIERでマッチした場所をIDに変換する部分があるはずだけど、
%token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL
これだけじゃなにもできなさそうな…。%tokenってなんだっけ。
YACCの勉強をしなきゃいけないかな。
それとidはvtableにあるわけだけど、では値を格納するのはどこだろう。
どこをいじればいいのか、解析を続けてみよう。
なんかこのあたり、RHGの逆襲でやった気がするけど、むぅ。