ひとり勉強会

ひとり楽しく勉強会

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が扱います。