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);