From 6ee3f00849dc68d98d8107786bf16b846cf5c880 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 18 Aug 2025 10:32:44 +0900 Subject: [PATCH] mruby-io: migrate File.path to C Implements File.path in C for better performance, replacing the Ruby implementation that used kind_of? check with direct C type validation. Co-authored-by: Claude --- mrbgems/mruby-io/mrblib/file.rb | 16 ---------------- mrbgems/mruby-io/src/file.c | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/mrbgems/mruby-io/mrblib/file.rb b/mrbgems/mruby-io/mrblib/file.rb index d9331ae37..25fc33bdf 100644 --- a/mrbgems/mruby-io/mrblib/file.rb +++ b/mrbgems/mruby-io/mrblib/file.rb @@ -275,20 +275,4 @@ class File < IO end - # - # call-seq: - # File.path(path) -> string - # - # Returns the string representation of the path - # - # File.path("/dev/null") #=> "/dev/null" - # File.path(Pathname.new("/tmp")) #=> "/tmp" - # - def self.path(filename) - if filename.kind_of?(String) - filename - else - raise TypeError, "no implicit conversion of #{filename.class} into String" - end - end end diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index 9760c52d4..25f60dbd9 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -1019,6 +1019,23 @@ mrb_file_extname(mrb_state *mrb, mrb_value klass) return mrb_str_new(mrb, path + dot_pos, len - dot_pos); } +/* + * call-seq: + * File.path(path) -> string + * + * Returns the string representation of the path + * + * File.path("/dev/null") #=> "/dev/null" + * File.path(Pathname.new("/tmp")) #=> "/tmp" + */ +static mrb_value +mrb_file_path(mrb_state *mrb, mrb_value klass) +{ + mrb_value filename; + mrb_get_args(mrb, "S", &filename); + return filename; +} + void mrb_init_file(mrb_state *mrb) { @@ -1036,6 +1053,7 @@ mrb_init_file(mrb_state *mrb) mrb_define_class_method_id(mrb, file, MRB_SYM(dirname), mrb_file_dirname, MRB_ARGS_REQ(1)); mrb_define_class_method_id(mrb, file, MRB_SYM(basename), mrb_file_basename, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)); mrb_define_class_method_id(mrb, file, MRB_SYM(extname), mrb_file_extname, MRB_ARGS_REQ(1)); + mrb_define_class_method_id(mrb, file, MRB_SYM(path), mrb_file_path, MRB_ARGS_REQ(1)); mrb_define_class_method_id(mrb, file, MRB_SYM(realpath), mrb_file_realpath, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)); mrb_define_class_method_id(mrb, file, MRB_SYM(absolute_path), mrb_file_absolute_path, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)); mrb_define_class_method_id(mrb, file, MRB_SYM_Q(absolute_path), mrb_file_absolute_path_p, MRB_ARGS_REQ(1));