summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrblib/io.rb4
-rw-r--r--src/io.c14
2 files changed, 14 insertions, 4 deletions
diff --git a/mrblib/io.rb b/mrblib/io.rb
index be715ba7a..c838b96e5 100644
--- a/mrblib/io.rb
+++ b/mrblib/io.rb
@@ -11,10 +11,6 @@ class IO
BUF_SIZE = 4096
- def self.for_fd *args
- self.new(*args)
- end
-
def self.open(*args, &block)
io = self.new(*args)
diff --git a/src/io.c b/src/io.c
index 5a6079e99..4f7fd25f0 100644
--- a/src/io.c
+++ b/src/io.c
@@ -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());