ひとり勉強会

ひとり楽しく勉強会

node==nullの場合

elseのないif文も構文解析の段階でif-then-else文にまとめられる、と書きました。実はあんまりちゃんと追ってないのですが、elseがなかった場合はnd_else==0の構文木が作られているようです。
実は、switch文に入るより前にこういうコードがありました。

if (node == 0) {
    if (!poped) {
        ADD_INSN(ret, 0, putnil);
        return COMPILE_OK;
    }
    return COMPILE_OK;
}

0のノードをコンパイルしようとすると、値が必要なら(!poped) nilをスタックに置く命令を生成し、必要ないなら何もせずにreturnしています。Rubyでは「elseなしのif文で条件が偽だったとき、全体の値はnil」となっています。この規則は以上のようにnode==0の場合として処理されているようでした。