aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--io.c24
-rw-r--r--test/ruby/test_io.rb7
3 files changed, 31 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 957427a784..a732fc6ce1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Dec 26 02:31:58 2010 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * io.c (advice_arg_check): Change argument check.
+ Now, an unsupported advice makes NotImplementedError.
+ [ruby-dev:42887] [Ruby 1.9-Feature#4204]
+
Sun Dec 26 03:00:53 2010 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* ext/socket/extconf.rb: Fix build error which was introduced r30372.
diff --git a/io.c b/io.c
index 943d124988..b154dcafc0 100644
--- a/io.c
+++ b/io.c
@@ -7396,10 +7396,10 @@ select_end(VALUE arg)
}
#endif
-#ifdef HAVE_POSIX_FADVISE
static VALUE sym_normal, sym_sequential, sym_random,
sym_willneed, sym_dontneed, sym_noreuse;
+#ifdef HAVE_POSIX_FADVISE
struct io_advise_struct {
int fd;
off_t offset;
@@ -7481,6 +7481,23 @@ do_io_advise(rb_io_t *fptr, VALUE advice, off_t offset, off_t len)
#endif /* HAVE_POSIX_FADVISE */
+static void
+advice_arg_check(VALUE advice)
+{
+ if (!SYMBOL_P(advice))
+ rb_raise(rb_eTypeError, "advice must be a Symbol");
+
+ if (advice != sym_normal &&
+ advice != sym_sequential &&
+ advice != sym_random &&
+ advice != sym_willneed &&
+ advice != sym_dontneed &&
+ advice != sym_noreuse) {
+ rb_raise(rb_eNotImpError, "Unsupported advice: :%s",
+ RSTRING_PTR(rb_id2str(SYM2ID(advice))));
+ }
+}
+
/*
* call-seq:
* ios.advise(advice, offset=0, len=0) -> nil
@@ -7530,8 +7547,7 @@ rb_io_advise(int argc, VALUE *argv, VALUE io)
rb_io_t *fptr;
rb_scan_args(argc, argv, "12", &advice, &offset, &len);
- if (!SYMBOL_P(advice))
- rb_raise(rb_eTypeError, "advice must be a Symbol");
+ advice_arg_check(advice);
io = GetWriteIO(io);
GetOpenFile(io, fptr);
@@ -10530,12 +10546,10 @@ Init_IO(void)
sym_textmode = ID2SYM(rb_intern("textmode"));
sym_binmode = ID2SYM(rb_intern("binmode"));
sym_autoclose = ID2SYM(rb_intern("autoclose"));
-#ifdef HAVE_POSIX_FADVISE
sym_normal = ID2SYM(rb_intern("normal"));
sym_sequential = ID2SYM(rb_intern("sequential"));
sym_random = ID2SYM(rb_intern("random"));
sym_willneed = ID2SYM(rb_intern("willneed"));
sym_dontneed = ID2SYM(rb_intern("dontneed"));
sym_noreuse = ID2SYM(rb_intern("noreuse"));
-#endif
}
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index b3d543fc2f..6cc2897f5f 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -1763,10 +1763,15 @@ End
end
end
end
+ end
+
+ def test_invalid_advise
+ feature4204 = '[ruby-dev:42887]'
+ t = make_tempfile
%w{Normal rand glark will_need zzzzzzzzzzzz \u2609}.map(&:to_sym).each do |adv|
[[0,0], [0, 20], [400, 2]].each do |offset, len|
open(make_tempfile.path) do |t|
- assert_equal(t.advise(adv, offset, len), nil)
+ assert_raise(NotImplementedError, feature4204) { t.advise(adv, offset, len) }
end
end
end