From 12dce91db8d1c4d0b93626454d6eba1ded94e069 Mon Sep 17 00:00:00 2001 From: Akira Yumiyama Date: Sat, 16 Nov 2013 14:28:40 +0900 Subject: [PATCH] support Dir.chdir with block --- mrblib/dir.rb | 15 +++++++++++++++ src/dir.c | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mrblib/dir.rb b/mrblib/dir.rb index b53a7102a..e00f8290a 100644 --- a/mrblib/dir.rb +++ b/mrblib/dir.rb @@ -40,6 +40,21 @@ class Dir end end + def self.chdir(path, &block) + my = self # workaround for https://github.com/mruby/mruby/issues/1579 + if block + wd = self.getwd + begin + self._chdir(path) + block.call + ensure + my._chdir(wd) + end + else + self._chdir(path) + end + end + class << self alias exists? exist? alias pwd getwd diff --git a/src/dir.c b/src/dir.c index 14108f8de..97e0c4fc9 100644 --- a/src/dir.c +++ b/src/dir.c @@ -237,7 +237,7 @@ mrb_mruby_dir_gem_init(mrb_state *mrb) mrb_define_class_method(mrb, d, "exist?", mrb_dir_existp, MRB_ARGS_REQ(1)); mrb_define_class_method(mrb, d, "getwd", mrb_dir_getwd, MRB_ARGS_NONE()); mrb_define_class_method(mrb, d, "mkdir", mrb_dir_mkdir, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)); - mrb_define_class_method(mrb, d, "chdir", mrb_dir_chdir, MRB_ARGS_REQ(1)); + mrb_define_class_method(mrb, d, "_chdir", mrb_dir_chdir, MRB_ARGS_REQ(1)); mrb_define_method(mrb, d, "close", mrb_dir_close, MRB_ARGS_NONE()); mrb_define_method(mrb, d, "initialize", mrb_dir_init, MRB_ARGS_REQ(1));