以下の記事で紹介させていただきました日経ソフトウエア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月号)にて修正が載るとのことです。