ひとり勉強会

ひとり楽しく勉強会

BEGIN と END

大文字の BEGIN

BEGIN { ... }

は、そのファイルの他の部分より先に必ず評価されるブロックで、構文解析の段階で、NODE_PRELUDE というノードになります。構文解析器がソースコードの中のBEGINブロックを全部取り出して

node
  nd_head : ソース中のBEGINブロックの中身
  nd_body : BEGIN以外の部分の中身

というノードを作ってくれるので、その順番にコンパイルするだけです。

case NODE_PRELUDE:{
  COMPILE_POPED(ret, "prelude", node->nd_head);
  COMPILE_(ret, "body", node->nd_body, poped);
  break;
}

大文字の END

END { ... }

は、この文が実行されたときに、終了処理としてブロックを登録します。これは単純にpostexeというYARVの1命令になります。

case NODE_POSTEXE:{
  VALUE block = NEW_CHILD_ISEQVAL(node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK);
  ADD_INSN1(ret, nd_line(node), postexe, block);