Rua: オブジェクトをテーブルに変換するようにした。

http://storehouse.sakura.ne.jp/viewvc/viewvc.cgi/rua/rua/rua.c?root=svn&view=markup
とりあえずこれで完成かな。
あとは、extconf.rb書いて、RubyForgeに登録してwin32用のバイナリ作って。。。


変換するコードはこんな感じ。

static void rua_newtable_from_obj(lua_State *L, VALUE obj, VALUE error_handler) {
  VALUE methods, name, method;
  int i, tblidx;

  lua_newtable(L);
  tblidx = lua_gettop(L);
  methods = rb_check_convert_type(obj, T_ARRAY, "Array", "methods");

  for (i = 0; i < RARRAY(methods)->len; i++) {
    name = rb_ary_entry(methods, i);
    method = rb_funcall(obj, rb_intern("method"), 1, name);
    rua_pushrbval(L, name, error_handler);
    rua_pushrbval(L, method, error_handler);
    lua_settable(L, tblidx);
  }
}

rb_obj_methodとrb_obj_methodsがなぜか見つからなかった。。。

↓な感じで、テーブルをオブジェクトに見立てて使う。selfの行方が気になる。メモリ上のどっか?

require 'rua'

rua = Rua.new
rua.openlibs(:all)

rua[:time] = Time.new

rua.eval(<<EOS)
  print(time.to_s())
  print(time.strftime('%Y-%m-%d %H:%M'))
EOS


Sat Nov 10 21:24:17 +0900 2007
2007-11-10 21:24


追記
こーゆーこともできた。ちょっと面白い。

require 'rua'

rua = Rua.new
rua.openlibs(:all)

rua[:Time] = Time

rua.eval(<<EOS)
  time = Time.new()
  print(time.to_s())
EOS