YamaKen
yamak****@bp*****
2005年 8月 24日 (水) 20:49:09 JST
At Wed, 24 Aug 2005 03:39:16 -0700, jun.l****@gmail***** wrote: > > On Wed, 24 Aug 2005 12:18:58 +0900 > YamaKen <yamak****@bp*****> wrote: > > uim APIの保護はuim_scm_eval_c_string()とuim_scm_eval()だけに仕掛 > > ければ大丈夫です。 > ;; 今、少し前に落とした trunk を見ると、同様の (ラップしてない) コードが > ;; ありましたが、大丈夫でしょうか。 あ、間違えてました。uim_scm_eval()の場合は呼び出し側のスタックに uim_lispがある事が普通ですからその都度ラップしてやらないとだめで すね。 > > libsscmや、uim APIを経由せずuim-scm APIを直接扱うコードではその > > ように自前でwrapper を用意して保護してもらう必要がありますね。 > [...] > > C99ならvariadic macroで解決できるんで、libsscmのユーザ向けには > > C99環境用のオプショナルなwrapperマクロを提供するあたりでどうでしょ > > う。uim APIを経由しないuim-scm APIの利用ではC89対応の手書き推奨 > > という事で。 > > > variadic macro で? どうするつもりでしょうか。何か poor man's variadic > macro (そんな言い方あるのか知りませんが) が使えない方法ですか? > > #define foo(vargs) (bar vargs) > > foo ((arg1, arg2, arg3)) --> (bar (arg1, arg2, arg3)) これなら大丈夫です。今までこの技法を知りませんでした… 「macro trick c "variable number"」でググったら以下のようなペー ジが大量に引っかかりましたが、特に定まった一般名称は無いようです ね。 http://www.lysator.liu.se/faq/c-faq/c-6.html 意図していたのは以下のような呼び出しです。 #define SCM_GC_PROTECT_STACK(func_invocation) \ { \ ScmObj *stack_start; \ \ stack_start = Scm_gc_protect_stack(); \ (func_invocation); \ Scm_gc_unprotect_stack(stack_start); \ } /* 実際にはSigScheme依存を隠蔽したUIM_SCM_GC_PROTECT_STACKを利用 */ SCM_GC_PROTECT_STACK(uim_create_context_internal(uc, lang, engine)); void uim_create_context_internal(uim_context uc, const char *lang, const char *engine) { uim_lisp id_ = uim_scm_make_int(uc->id); uim_lisp lang_ = uim_scm_make_str(lang); uim_lisp engine_ = uim_scm_make_str(engine); uim_lisp proc = uim_scm_make_symbol("create-context"); uim_lisp form = uim_scm_list4(proc, id_, lang_, engine_); uim_scm_eval(form); } ------------------------------- ヤマケン yamak****@bp*****