From eada6350332155972f19bad52bd8621f607520a2 Mon Sep 17 00:00:00 2001 From: eileencodes Date: Wed, 2 Sep 2020 08:56:13 -0400 Subject: Add category to `rb_warn_deprecated` PR https://github.com/ruby/ruby/pull/3418 added a category to `rb_warn_deprecated_to_remove` but not to `rb_warn_deprecated`. This adds the same code to `rb_warn_deprecated` so that those warnings also get a category. This change also adds tests for `rb_warn_deprecated` and updates the tests for `rb_warn_deprecated_to_remove` to have clearer names. I've fixed the call to `rb_method_entry` as we need to be using the instance method, not singleton. Feature: https://bugs.ruby-lang.org/issues/17122 --- error.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'error.c') diff --git a/error.c b/error.c index 841ab6c97f..a9adf57162 100644 --- a/error.c +++ b/error.c @@ -392,7 +392,22 @@ rb_warn_deprecated(const char *fmt, const char *suggest, ...) rb_str_cat_cstr(mesg, " is deprecated"); if (suggest) rb_str_catf(mesg, "; use %s instead", suggest); rb_str_cat_cstr(mesg, "\n"); - rb_write_warning_str(mesg); + + VALUE warn_args[2]; + warn_args[0] = mesg; + + const rb_method_entry_t * me; + me = rb_method_entry(rb_singleton_class(rb_mWarning), id_warn); + + if (rb_method_entry_arity(me) != 1) { + VALUE kwargs = rb_hash_new(); + rb_hash_aset(kwargs, ID2SYM(rb_intern("category")), ID2SYM(rb_intern("deprecated"))); + warn_args[1] = kwargs; + + rb_funcallv_kw(rb_mWarning, id_warn, 2, warn_args, RB_PASS_KEYWORDS); + } else { + rb_funcall(rb_mWarning, id_warn, 1, mesg); + } } void @@ -411,7 +426,7 @@ rb_warn_deprecated_to_remove(const char *fmt, const char *removal, ...) warn_args[0] = mesg; const rb_method_entry_t * me; - me = rb_method_entry(rb_mWarning, id_warn); + me = rb_method_entry(rb_singleton_class(rb_mWarning), id_warn); if (rb_method_entry_arity(me) != 1) { VALUE kwargs = rb_hash_new(); -- cgit v1.2.1