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));