2006年 10月 25日

Ruby/SpiderMonkey function

c.eval("String.prototype").function("dump") {|this| p this.to_s.dump}
c.eval('"aaa".dump()')

this が ruby 側でとれない?みたいなので書き換えた。なにか方法あるのかな

--- spidermonkey.c.orig	2006-10-25 23:37:28.000000000 +0900
+++ spidermonkey.c	2006-10-25 23:58:26.000000000 +0900
@@ -598,10 +598,11 @@
 	so = (sSMJS_Class*)JS_GetPrivate( cx, fobj );
 
 	// 引数をSpiderMonkey::Valueに 
-	rargs = rb_ary_new2( argc + 1);
+	rargs = rb_ary_new2( argc + 2);
+	rb_ary_store( rargs, 0, rb_smjs_convert_prim( cx, thisobj )  );
 	for( i=0; i<argc; i++ )
-		rb_ary_store( rargs, i, rb_smjs_convert_prim( cx, argv[i] ) );
-	rb_ary_store( rargs, i, so->rbobj );
+		rb_ary_store( rargs, i+1, rb_smjs_convert_prim( cx, argv[i] ) );
+	rb_ary_store( rargs, i+1, so->rbobj );
 
 	// proc を実行 
 	res = rb_protect( rb_smjs_ruby_proc_caller, rargs, &status );

あーこれじゃだめだ。影響が広すぎて ruby のメソッドをそのまま呼べなくなる。新しいメソッドを定義するほうがいいのかなぁ。function_with_this みたいな