日経ソフトウエア掲載のMILにバグがありました

以下の記事で紹介させていただきました日経ソフトウエア8月号の記事について、バグをご指摘いただきました。
http://d.hatena.ne.jp/kmaebashi/20100704/p1

バグご指摘のツイート:
http://twitter.com/aifaruba/status/20618838814

@aifaruba 様、ご指摘いただき、ありがとうございました。

static void
fix_labels(void)
{
  int i;

  for (i = 0; i < g_bytecode_size; i++) {
    if (g_bytecode[i] == OP_PUSH_INT
        || g_bytecode[i] == OP_PUSH_STRING
        || g_bytecode[i] == OP_PUSH_VAR
        || g_bytecode[i] == OP_ASSIGN_TO_VAR) {
      i++;
    } else if (g_bytecode[i] == OP_JUMP
               || g_bytecode[i] == OP_JUMP_IF_ZERO
               || g_bytecode[i] == OP_GOSUB) {
      g_bytecode[i+1]
        = st_label_table[g_bytecode[i+1]].address;
      i++; /* ←これが抜けていました。*/
    }
  }
}

このi++;が抜けていることにより、ループの次の回ではバイトコードではなく今置換したジャンプ先アドレスを指すことになります。たまたまそれがジャンプ系の命令と合致しなければスカるだけ(2ワード命令と合致すれば1ワード余計にスカりますが)なので気付かなかったようです。

ご迷惑をおかけし大変申しわけありませんでした。

9月24日発売号(日経ソフトウエア11月号)にて修正が載るとのことです。