diff options
| author | Tomoyuki Sahara <[email protected]> | 2014-12-26 11:09:07 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2014-12-26 11:09:07 +0900 |
| commit | 3a97a453c486cd1ce9456970b686ab24f8126980 (patch) | |
| tree | 3c005935d7ccf7455791c685698916863b0e5047 /src | |
| parent | c455544ee28e440f371c4f758f2b31ee69ec0877 (diff) | |
| download | mruby-3a97a453c486cd1ce9456970b686ab24f8126980.tar.gz mruby-3a97a453c486cd1ce9456970b686ab24f8126980.zip | |
rewrite IO.for_fd.
IO.for_fd should call IO#initialize to initialize the created object
properly. It cannot be implemented in Ruby.
Diffstat (limited to 'src')
| -rw-r--r-- | src/io.c | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -357,6 +357,19 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int noraise) } mrb_value +mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass) +{ + struct RClass *c = mrb_class_ptr(klass); + enum mrb_vtype ttype = MRB_INSTANCE_TT(c); + mrb_value obj; + + /* copied from mrb_instance_alloc() */ + if (ttype == 0) ttype = MRB_TT_OBJECT; + obj = mrb_obj_value((struct RObject*)mrb_obj_alloc(mrb, ttype, c)); + return mrb_io_initialize(mrb, obj); +} + +mrb_value mrb_io_s_sysclose(mrb_state *mrb, mrb_value klass) { mrb_int fd; @@ -847,6 +860,7 @@ mrb_init_io(mrb_state *mrb) mrb_define_class_method(mrb, io, "_popen", mrb_io_s_popen, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "_sysclose", mrb_io_s_sysclose, MRB_ARGS_REQ(1)); #endif + mrb_define_class_method(mrb, io, "for_fd", mrb_io_s_for_fd, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "select", mrb_io_s_select, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "sysopen", mrb_io_s_sysopen, MRB_ARGS_ANY()); |
