[Gauche-devel-jp] Re: proc_inline.c

Back to archive index

HIRAUCHI Hideyuki hira****@verys*****
2004年 2月 21日 (土) 03:10:56 JST


ちょっと末尾のソースを見て欲しいのですが、私のアイデアってこんな感じです。
これでリファクタリングのつもりなんですが、
この時点で何か勘違いなどありましたら、ご指摘ください。

私はこれから、Unix環境の準備にかかるとします。
Cygwinじゃスレッドまわりのテストできないって、今になって気付きました。

いちおう最適化オプション-O3(インライン展開する)でコンパイルは通りました。
ホントに展開されているかどうかは未確認です。
gccのマニュアルはここを参考にしました(ちと古いかも)。
- 最適化を制御するオプション
    http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html#SEC10

以下、ソースの抜粋。Putbの部分。

--hira


/* Convenience macro */

#define CLOSE_CHECK(port)                                               \
    do {                                                                \
        if (SCM_PORT_CLOSED_P(port)) {                                  \
            UNLOCK(p);                                                  \
            Scm_Error("I/O attempted on closed port: %S", (port));      \
        }                                                               \
    } while (0)

#define CLOSE_CHECK_UNSAFE(port)                                        \
    do {                                                                \
        if (SCM_PORT_CLOSED_P(port)) {                                  \
            Scm_Error("I/O attempted on closed port: %S", (port));      \
        }                                                               \
    } while (0)

/*=================================================================
 * Putb
 */

#ifdef SAFE_PORT_OP

inline void Scm_PutbUnsafe(ScmByte b, ScmPort *p)
{
    CLOSE_CHECK_UNSAFE(p);

    switch (SCM_PORT_TYPE(p)) {
    case SCM_PORT_FILE:
        if (p->src.buf.current >= p->src.buf.end) {
            bufport_flush(p, 1, FALSE);
        }
        SCM_ASSERT(p->src.buf.current < p->src.buf.end);
        *p->src.buf.current++ = b;
        if (p->src.buf.mode == SCM_PORT_BUFFER_NONE) {
            bufport_flush(p, 1, FALSE);
        }
        break;
    case SCM_PORT_OSTR:
        SCM_DSTRING_PUTB(&p->src.ostr, b);
        break;
    case SCM_PORT_PROC:
        p->src.vt.Putb(b, p);
        break;
    default:
        Scm_Error("bad port type for output: %S", p);
    }
}

void Scm_Putb(ScmByte b, ScmPort *p)
{
    VMDECL;
    LOCK(p);
    PORT_SAFE_CALL(p, Scm_PutbUnsafe(b, p));
    UNLOCK(p);
}

#endif





Gauche-devel-jp メーリングリストの案内
Back to archive index