znzの日記

 | 

2006-10-11

rubyソースを読んだ編

  • まず grep END *.* してみたらヒットしすぎ。
  • grep END lex.c parse.yというあたりで探してみるとklENDらしいとわかる。
  • parse.yのklENDのところをページャーで見てNEW_POSTEXEがポイントっぽい気がしたので、
  • grep NEW_POSTEXE *.*で「node.h:#define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0)」
  • grep NODE_POSTEXE *.*eval.cを見れば良さそうと気づく。
  • eval.cのcase NODE_POSTEXEでrb_f_END()が実際の処理っぽい。
  • grep rb_f_END *.*してみたら、eval.cの中にrb_f_ENDがあった。
  • 肝はrb_set_end_procっぽい。すぐ下にrb_f_at_exit()があって、その中でもrb_set_end_procを呼んでいる。
  • rb_set_end_procの仲まで見ずにENDat_exitで登録したブロックは別々のリストではなく混ざったリストで実行されるらしいとわかる。
 |