summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--error.c9
-rw-r--r--test/ruby/test_exception.rb4
2 files changed, 9 insertions, 4 deletions
diff --git a/error.c b/error.c
index 9f8cdf8fe6..e064eef4bc 100644
--- a/error.c
+++ b/error.c
@@ -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|