tcc(3)
まったく何も分ってないけど,適当にコードを切り貼りしたらforの中で変数を宣言できるようになった.
しかしコンパイル早いなー.tccで改造したtccをコンパイルしなおして,それでテスト用のソースをコンパイルしても一瞬で終わるよ.
} else if (tok == TOK_FOR) { // キーワードforを発見! int e; next(); skip('('); //TEST support declaration at for-initialize section #if 1 // 新しいスコープを作るためにスタックを退避 Sym *s; s = local_stack; if (tok != ';') { int tok_old = tok; decl(VT_LOCAL); if (tok_old == tok) { // トークンが変化していない→式扱いする gexpr(); vpop(); skip(';'); } } else { skip(';'); } #else // original code if (tok != ';') { gexpr(); vpop(); } skip(';'); #endif d = ind; c = ind; a = 0; b = 0; if (tok != ';') { gexpr(); a = gtst(1, 0); } skip(';'); if (tok != ')') { e = gjmp(0); c = ind; gexpr(); vpop(); gjmp_addr(d); gsym(e); } skip(')'); block(&a, &b, case_sym, def_sym, case_reg, 0); gjmp_addr(c); gsym(a); gsym_addr(b, c); #if 1 sym_pop(&local_stack, s); // スコープを戻す #endif } else
トークンが変化してなかったら式扱いってどうなのよ?
この間までcall/ccを弄っていた所為か"gjmp"の単語に惹かれるものがある.