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

2006-07-22

進捗 14:01 進捗 - nazonoRubyist RubyでJavaScriptのためにC を含むブックマーク はてなブックマーク - 進捗 - nazonoRubyist RubyでJavaScriptのためにC 進捗 - nazonoRubyist RubyでJavaScriptのためにC のブックマークコメント

お久しぶりです! ってもう一ヶ月か!

最近もずっと作成は続けてます。こんなのが動く感じになりました

cx = SpiderMonkey::Context.new
cx.set_property( "Time", Time );
script ='Time.at(100).strftime("%Y/%m/%d")'
assert_equal eval(script), cx.eval( script ), script

えー、何をしているかというと、spidermonkeyRubyTimeオブジェクトを食わせ、javascript中からそのメソッドのメソッドを実行してみた結果と、実際のRubyの結果が一致していることを試しているわけです。

Rubyhoge= の様なメソッドで値を設定するには、 jsobj['hoge=']( huga ) の要に呼べば!(汗)

逆の方はほとんどできていませんが、method_missing で実装できそうな気がするので、「RubyからJavaScriptオブジェクトのメソッドを呼ぶ」ためには、長いメソッド名が必要になります。set_property のような。

関数の相互呼び出しや例外の受け渡しも一応できているつもりです。

 def test_deffunc_exception
    cx = SpiderMonkey::Context.new
    x = cx.eval("x={}")
    pr = x.function( "func1" ){|*arg|
      raise TESTException.new("test")
    }
    assert_raise( TESTException ){
      pr.call();
    }
    assert_raise( TESTException ){
      cx.eval("x.func1()")
    }
    assert_raise( TESTException ){
      x.call_function("func1")
    }
    assert_nothing_thrown {
      cx.eval(" try{ x.func1(); }catch(e){} ")
    }
    assert_equal "test", cx.eval(" try{ x.func1(); }catch(e){e.toString()} ")
    assert_equal TESTException, cx.eval(" y=null; try{ x.func1(); }catch(e){ y=e['class']; } y")
    
  end

こんな感じですね。

each、each_with_index も実装しました。

def test_each_hash
  cx = SpiderMonkey::Context.new
   x = cx.eval("x={a:1, b:2}")
  r = []
  x.each{|a| r << a }
  assert_equal [1,2], r
  r2 = []
  for i in x
   r2 << i
  end
  assert_equal [1,2], r2
end

eachが実装されているのでEnumerableクラスをincludeすれば色々使える関数が増えます、が、method_missingjavascript関数・プロパティーを呼び出させようと考えているので、色々かち合ってまずそうな予感、がするのでそれはしていません。

目下の問題点は

  • プリミティブ値のeachができない( for(..in..)の構文がそれっぽくなるようにしたいので、Stringeachはできるようにしたい… )
  • cvs版のSpiderMonkey(1.7-pre)だとRubyで定義した関数に typeof をすると object と判定されてしまう( 1.5-pre だと 'function'が返ってくる

です。

一応使えるはず

一応それっぽく使えるはずなので、色々使ってみて要望ください m(..)m

http://nazo.yi.org/rubysmjs/ruby-smjs.tar.gz

とりあえず、落ちるのは最低限最優先でなおしたいと思いますので、落ちたら落ちたぞーとコメントください。というか落ちるテストを書いて、ついでに直すパッチも書いてくれると最高です

ゲスト



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