NODE_BEGIN
begin 〜 end 構文です。rescueやensureがつくと、構文解析の段階でいろいろとノードの種類が変わってきます。まとめると以下の通り。
begin AAA end # NODE_BEGIN(AAA) begin AAA ensure EEE end # NODE_ENSURE(AAA,EEE) begin AAA rescue .. BBB rescue .. CCC else DDD end # NODE_RESCUE(AAA, # NODE_RESBODY(BBB,CCC) # DDD) begin AAA rescue .. BBB rescue .. CCC else DDD ensure EEE end # NODE_ENSURE(AAA, NODE_RESCUE(..))
YARV に NODE_BEGIN で渡ってくるのは他に何も節がついていない時なので、コンパイルは簡単です。本体をそのままコンパイルするだけ。
case NODE_BEGIN:{ COMPILE_(ret, "NODE_BEGIN", node->nd_body, poped); break; }
その他の場合は、NODE_ENSUREとNODE_RESCUEが扱います。