nazonoRubyist RubyでJavaScriptのためにC このページをアンテナに追加 RSSフィード

2006-06-20

JSRuntimeはグローバルに 13:04 JSRuntimeはグローバルに - nazonoRubyist RubyでJavaScriptのためにC を含むブックマーク はてなブックマーク - JSRuntimeはグローバルに - nazonoRubyist RubyでJavaScriptのためにC JSRuntimeはグローバルに - nazonoRubyist RubyでJavaScriptのためにC のブックマークコメント

はじめはJSRuntimeもオブジェクトにして、

jsruntime = SpiderMonkey::Runtime.new
jscontext = SpiderMonkey::Context.new( jsruntime )
jscontext.eval(%! x=1; %!)

のように実行させるようにしようかと思ったのだが、あまりに冗長。

なので、SpiderMonkeyクラスクラス変数として @@defaultRuntime、 @@defuaultContext をあらかじめ設定しておけばよいかな、とも思ったけど、Runtimeをそんなにいくつも定義する必要はなさそうなので、

  • JSRuntimeはCのグローバル変数で値を持つ(Rubyからはさわれない)
  • 終了時に DestoryおよびShutDownする

という方向で。いいのかなー。マルチスレッドとかどうなるんだろう。まあ、問題があるとわかった時点で先の方針に変更するか。

コンテキストもグローバルに一つでいいじゃん、とも思うけれど、そうでない場合もまま考えられるので、一応クラスにして、クラス変数 @@defaultCondext をクラスに設定する方向で。


終了時に実行するatexit

ところで、初期化は Init_spidermonkey 内で行うとして、終了処理はどうすればいいのだろう。モダンOSならメモリ漏れてもその辺勝手にやってくれるにちがいない!などという悪魔のささやきにも負けず調べてみると、

Win32OLE の製作過程というページで、atexitという関数があることを知る。

# OLEの後始末は,Rubyで用意しているCの関数 atexit を利用する.

ほほう、と思ったのだが! win32ole現在ソースを見てみると、

http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/ext/win32ole/win32ole.c?rev=1.57

static void
ole_initialize() 
{
    HRESULT hr;
    
    if(gOLEInitialized == Qfalse) {
        hr = OleInitialize(NULL);
        if(FAILED(hr)) {
            ole_raise(hr, rb_eRuntimeError, "fail: OLE initialize");
        }
        gOLEInitialized = Qtrue;
        /*
         * In some situation, OleUninitialize does not work fine. ;-<
         */
        /*
        atexit((void (*)(void))ole_uninitialize);
        */
    }
}

えー some situation ってなんだー

しかし、試してみたところ、終了時に実行されているので、これで。some situation ってなんだー


本日のコード

JSRuntime *gJSRuntime;

void
rb_smjs_rumtime_release(){
  if(gJSRuntime)
    JS_RuntimeDelete( gJSRuntime );
  JS_ShutDown();
}

void
Init_spidermonkey(){
  gJSRuntime = JS_NewRuntime(0x400000L);
	if (!gJSRuntime)
		rb_raise(eJSError, "can't create JavaScript runtime");

	atexit( rb_smjs_rumtime_release );
}

うーん、Init で例外とばしても大丈夫なのかな。

トラックバック - http://rubyist.g.hatena.ne.jp/nazoking/20060620