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"の単語に惹かれるものがある.