From: SASADA Koichi Date: 2012-06-22T19:23:41+09:00 Subject: [ruby-dev:45793] Re: [ruby-changes:24028] yugui:r36079 (trunk): Embedding CRuby interpreter without internal headers has been difficult (2012/06/21 15:20), SASADA Koichi wrote: >> > >> > * rb_eval_string_with_filename(VALUE string, VALUE fname); >> > * rb_eval_string_with_filename_protect(VALUE string, VALUE fname, int* state); >> > を追加、 >> > >> > という提案をします。異論が無ければあとでコミットしますが、特に追加する関数の名前について何かご意見(もっと良い名前)は無いでしょうか。 ... > もう少し考えさせて下さい.  ええと,本当に欲しいのは rb_ なのか ruby_ なのか,ってところでまた迷っ ています.迷いすぎ.  下記,考えながら書いているので,もし間違いがあればご指摘下さい. ruby_ と rb_ の原則の整理: (1) ruby_ なのは組み込み用.組み込むアプリが直接呼ぶ API. (2) rb_ なのは基本的に拡張ライブラリ用 API.下記の制限がある. (2-1) すでに VM が初期化済みでなければならない.   (ruby_ な関数にも,そういうのあるなぁ) (2-2) GET_THREAD() で rb_thread_t で取れるスレッドの情報に登録された ネイティブスレッドと動かすネイティブスレッドが同じでないといけ ない. (2-3) SAVE_ROOT_JMPBUF() で囲まれた部分から呼ばれたものじゃないと まずい... かも.例外が発生したときに最終的にどうなるか決めている. (2-4) GVL を獲得していなければいけない.  上記に書いていますが,(2-1) は ruby_ でも同じですね.(2-2) も,そうい うところがある.(2-3),(2-4) が rb_eval_string() ではまりそうです.  (2-3) については,rb_eval_string_protect() で問題無い気がする.(2-4) は,スレッドを切り替えなければ自然とそうなると思われる.だから,とりあえ ずいいのかな.  こういう懸念がある,という上で,後で変えるかもしれないけど,そんときは そんとき,ということで突っ込んで頂いてもいいような気がします.お願いでき ますか? やって頂ける場合は,他の取り下げたコードの revert なども一緒に やって頂ければ(私のほうで revert しようかと思ったら,何がどうだったかわ からなくなって断念しました). ----  アプリ組込みについて,面倒なことといえば,まだシグナルハンドラとかの話 がありますね.その辺も,もうちょっと柔軟に出来る様にしたいと思っています. アプリ組込み方法(案) (1) 初級 ruby_options() を使う(お勧め) (2) 中級 rb_eval_string_protect() を使う (3) 上級(なんか新しく作る,細かい API) みたいな感じに,色々用途によって変更できるといいなぁ,と思っています.上 級は inits から自分で自由にやるようなのを想定.  これについての TODO: - 上級用の,初期化 API - アプリ <-> Ruby の通信路(標準的な転送手段) - 関係無いネイティブスレッド上で安全に Ruby を走らせる方法 - ドキュメント -- // SASADA Koichi at atdot dot net