diff options
author | Jeremy Evans <code@jeremyevans.net> | 2020-09-02 15:49:40 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2020-09-28 08:38:06 -0700 |
commit | 92c3ad9c276d048bf6fba1145ffccf8678fe8af1 (patch) | |
tree | 8d5eb4c4bcfc9871e95d6596758fdb590649e00b | |
parent | 5d7953f86b7ae164017e2292dfb3c108e0e02527 (diff) | |
download | ruby-92c3ad9c276d048bf6fba1145ffccf8678fe8af1.tar.gz |
Make Warning.warn accept only category keyword
In general accepting arbitrary keywords is a bad idea unless you are
delegating keywords or acting on arbitrary keywords. In this case,
the category keyword is ignored, and it's less error prone to not
ignore all keywords.
-rw-r--r-- | error.c | 9 | ||||
-rw-r--r-- | test/ruby/test_exception.rb | 4 |
2 files changed, 9 insertions, 4 deletions
@@ -72,6 +72,7 @@ static VALUE rb_mWarning; static VALUE rb_cWarningBuffer; static ID id_warn; +static ID id_category; extern const char ruby_description[]; @@ -231,11 +232,11 @@ rb_warning_s_aset(VALUE mod, VALUE category, VALUE flag) /* * call-seq: - * warn(msg, **kw) -> nil + * warn(msg, category: nil) -> nil * * Writes warning message +msg+ to $stderr. This method is called by * Ruby for all emitted warnings. A +category+ may be included with - * the warning. + * the warning, but is ignored by default. */ static VALUE @@ -243,8 +244,11 @@ rb_warning_s_warn(int argc, VALUE *argv, VALUE mod) { VALUE str; VALUE opt; + VALUE category; rb_scan_args(argc, argv, "1:", &str, &opt); + if (!NIL_P(opt)) rb_get_kwargs(opt, &id_category, 0, 1, &category); + Check_Type(str, T_STRING); rb_must_asciicompat(str); rb_write_error_str(str); @@ -2749,6 +2753,7 @@ Init_Exception(void) id_errno = rb_intern_const("errno"); id_i_path = rb_intern_const("@path"); id_warn = rb_intern_const("warn"); + id_category = rb_intern_const("category"); id_top = rb_intern_const("top"); id_bottom = rb_intern_const("bottom"); id_iseq = rb_make_internal_id(); diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index 120b041830..0333fd52ea 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -925,8 +925,8 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status| remove_method :warn if category - define_method(:warn) do |str, **kw| - warning << [str, kw[:category]] + define_method(:warn) do |str, category: nil| + warning << [str, category] end else define_method(:warn) do |str| |