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の逆襲でやった気がするけど、むぅ。