Google V8 JavaScript EngineでFFIをテスト

FFIのテストのためにGoogle V8 JavaScript Engineを使って見ました。
まずhttp://code.google.com/apis/v8/build.htmlの説明に従ってlibv8.soを作ります。次にCで書いた簡単なスタブライブラリlibv8stub.soを作ります。これはV8はC++で書かれていてイプシロンから直接呼び出すことができないからです。

libv8stub.soを作るためのv8stub.cppのリストは以下のようになります。これはV8のsamples/shell.ccから必要な分を切り出しました。

/* 
    v8stub.cpp -> libv8stub.so
    g++ -Iinclude v8stub.cpp -o libv8stub.so -shared -L. -lv8 -lpthread
*/
#include <v8.h>
#include <stdlib.h>
extern "C" int v8stub(char* source);

using namespace v8;

int v8stub(char* source)
{
    HandleScope handle_scope;
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    Handle<Context> context = Context::New(NULL, global);
    Context::Scope context_scope(context);
    Handle<Script> script = Script::Compile(String::New(source), String::New("(shell)"));
    return script->Run()->Int32Value();
}

V8にfib(39)を計算してもらうSchemeスクリプトは以下のようになります。

#|
    v8drive.scm
    export LD_LIBRARY_PATH=.
    ypsilon v8drive.scm
|#
(import (ffi) (time))
(define libv8stub-name "libv8stub.so")
(define libv8stub (load-shared-object libv8stub-name))
(define v8stub (c-function libv8stub libv8stub-name int v8stub (char*)))

(time (display (v8stub
  "fib = function(n) {
     if (n < 2) {
       return n;
     } else {
       return fib(n - 2) + fib(n - 1);
     }
   }
   fib(39);"
)))

めちゃめちゃ簡単ですね :D
そして・・・

$ ls libv8*
libv8.a  libv8.so  libv8stub.so
$ export LD_LIBRARY_PATH=.
$ ypsilon v8drive.scm 
63245986
;;  2.264296 real    2.256141 user    0.0 sys

もう他人のふんどしで相撲取りまくりですね :p