dir.c: don't raise after close

* dir.c (dir_close): don't raise on dobule close for consistent to
  IO#close.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50064 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-03-23 14:18:30 +00:00
Родитель 2ffb87995a
Коммит 78a73a538d
3 изменённых файлов: 16 добавлений и 4 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Mon Mar 23 23:18:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* dir.c (dir_close): don't raise on dobule close for consistent to
IO#close.
Mon Mar 23 21:22:07 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* win32/file.c (rb_readlink): move from file.c for better buffer

14
dir.c
Просмотреть файл

@ -542,12 +542,17 @@ dir_closed(void)
rb_raise(rb_eIOError, "closed directory");
}
static struct dir_data *
dir_get(VALUE dir)
{
rb_check_frozen(dir);
return rb_check_typeddata(dir, &dir_data_type);
}
static struct dir_data *
dir_check(VALUE dir)
{
struct dir_data *dirp;
rb_check_frozen(dir);
dirp = rb_check_typeddata(dir, &dir_data_type);
struct dir_data *dirp = dir_get(dir);
if (!dirp->dir) dir_closed();
return dirp;
}
@ -831,7 +836,8 @@ dir_close(VALUE dir)
{
struct dir_data *dirp;
GetDIR(dir, dirp);
dirp = dir_get(dir);
if (!dirp->dir) return Qnil;
closedir(dirp->dir);
dirp->dir = NULL;

Просмотреть файл

@ -126,6 +126,7 @@ class TestDir < Test::Unit::TestCase
def test_close
d = Dir.open(@root)
d.close
assert_nothing_raised(IOError) { d.close }
assert_raise(IOError) { d.read }
end