From: Kazuhiro Yoshida Date: 2000-07-07T22:28:26+09:00 Subject: [ruby-dev:10260] errorsource, errorline もりきゅうです。 Yukihiro Matsumoto さんは書きました: >|Ruby/C API のほうでも用意していただけるとうれしいです。 > >実は組み込みはあまり実績を積んでいないので、あまり洗練されて >いません。実績の6割は前田さんによって行われているような。組 >み込みAPIをどうするかについてはいろいろ考えてから決めた方が >良さそうに思います。 > >そういう話に付き合ってくれる人は歓迎します。 ありがとうございます。 こちらは MS-Windows 上で Delphi から Ruby を使う,という状況 ですので,具体的なコードが書きにくいですけれども,なるたけ C 風に書くようにしたいと思います。 現状の組み込み Ruby は,ruby_init して,何らかの処理をした後に Ruby インタプリタを初期化する手段が用意されていないと思います。 組み込み Ruby と,普通の Ruby を比較して,ひっかかる点は * 大域変数が残る * スレッドが残る * errinfo が残る といったことですけど, * 定数が残る * require の効果が持続 * include の効果が持続 といったことも,戻しようがないですよね。アプリケーションを終了 させる以外に方法がない。 これが,例えば,もういちど ruby_init を呼べば最初に ruby_init を呼んだときとまったく同じ状態になれば,うれしいです。 閑話休題。 errinfo に関して, 例外で rb_load_protect() が終了したときに char *errorsource; int errorline; という情報を直接得ることは可能でしょうか? Apollo.exe は,Memo component 上に errorsource のファイルを 開き,errorline の位置に caret を移動します。 現状では errinfo.backtrace (array) の最初の要素 (string) を split(':') して errorsource, errorline を得ています。 -- #{errorsource}:#{errorline}: parse error #{errorsource}:#{errorline}: in #{method} -- MS-Windows ではドライブ名が errorsource に含まれ,ドライブ名 のセパレータ(?) が ':' なので,例えば -- C:\usr\src\ap\foo.rb:16: parce error -- となり,split(':') がうまくいきません。Apollo.exe では errorsource.length == 1 ならばドライブ名とみなす,という実に 煩雑な処理をしてます。 ---- Kazuhiro Yoshida moriq@moriq.com