OPコードフィルタで高速なアクセサ(というアイデア)
perl - no accessor; # だって遅いんだもん
最近流行のPL_checkハックで,$o->fooを$o->{foo}に書き換えるOPコードフィルタを作れないものかと思った。
$ perl -MO=Concise -e '$o->foo' # これが 7 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -e:1) v:{ ->3 6 <1> entersub[t2] vKS/TARG ->7 3 <0> pushmark s ->4 - <1> ex-rv2sv sKM/1 ->5 4 <#> gvsv[*o] s ->5 5 <$> method_named[PV "foo"] ->6 -e syntax OK $ perl -MO=Concise -e '$o->{foo}' # こうなればいい 8 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -e:1) v:{ ->3 7 <2> helem vK/2 ->8 5 <1> rv2hv[t2] sKR/1 ->6 4 <1> rv2sv sKM/DREFHV,1 ->5 3 <#> gv[*o] s ->4 6 <$> const[PV "foo"] s/BARE ->7 -e syntax OK
OP_ENTERSUB以下のOP TreeをOP_HELEM以下のOP Treeに差し替えればいいような気がするが,よく分からない。perl -Dxやperl -MO=Terse等をみるともう少し詳しい構造が分かるが,それでも自力でOP Treeを組み立てるのはなかなか難しい。
PerlVM Hackerへの道のりは遠いようだ。