summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2020-12-16 08:15:13 -0800
committerJeremy Evans <code@jeremyevans.net>2020-12-18 09:54:11 -0800
commit52fb696ee7d01b1d55a1d5c42c60c6a5ebfc4502 (patch)
tree86045676ae96f24768fdc841ca613ee314731c82
parent7b06085c7bf8cc0db157e46fb11d16a6447d4d63 (diff)
Switch rb_category_warn{,ing} to accept an rb_warning_category_t
Since we decided to only allowing specific warning categories, there is no reason to have an API that accepts a general string, as it is more error-prone. Switch to only allowing the specific warning categories. As rb_category_warn{,ing} are public API, this requires making rb_warning_category_t public API as well.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3917
-rw-r--r--error.c16
-rw-r--r--include/ruby/internal/error.h11
-rw-r--r--internal/error.h7
3 files changed, 21 insertions, 13 deletions
diff --git a/error.c b/error.c
index e10485dc4e..2b637421f7 100644
--- a/error.c
+++ b/error.c
@@ -77,6 +77,7 @@ static ID id_deprecated;
static ID id_experimental;
static VALUE sym_category;
static VALUE warning_categories;
+static VALUE warning_category_t_map;
extern const char ruby_description[];
@@ -403,11 +404,11 @@ rb_warn(const char *fmt, ...)
}
void
-rb_category_warn(const char *category, const char *fmt, ...)
+rb_category_warn(rb_warning_category_t category, const char *fmt, ...)
{
if (!NIL_P(ruby_verbose)) {
with_warning_string(mesg, 0, fmt) {
- rb_warn_category(mesg, ID2SYM(rb_intern(category)));
+ rb_warn_category(mesg, rb_hash_fetch(warning_category_t_map, INT2NUM(category)));
}
}
}
@@ -435,11 +436,11 @@ rb_warning(const char *fmt, ...)
/* rb_category_warning() reports only in verbose mode */
void
-rb_category_warning(const char *category, const char *fmt, ...)
+rb_category_warning(rb_warning_category_t category, const char *fmt, ...)
{
if (RTEST(ruby_verbose)) {
with_warning_string(mesg, 0, fmt) {
- rb_warn_category(mesg, ID2SYM(rb_intern(category)));
+ rb_warn_category(mesg, rb_hash_fetch(warning_category_t_map, INT2NUM(category)));
}
}
}
@@ -2839,6 +2840,13 @@ Init_Exception(void)
rb_gc_register_mark_object(warning_categories);
rb_hash_aset(warning_categories, ID2SYM(rb_intern_const("deprecated")), Qtrue);
rb_obj_freeze(warning_categories);
+
+ warning_category_t_map = rb_hash_new();
+ rb_gc_register_mark_object(warning_category_t_map);
+ rb_hash_aset(warning_category_t_map, INT2NUM(RB_WARN_CATEGORY_NONE), Qnil);
+ rb_hash_aset(warning_category_t_map, INT2NUM(RB_WARN_CATEGORY_DEPRECATED), ID2SYM(rb_intern_const("deprecated")));
+ rb_hash_aset(warning_category_t_map, INT2NUM(RB_WARN_CATEGORY_EXPERIMENTAL), ID2SYM(rb_intern_const("experimental")));
+ rb_obj_freeze(warning_category_t_map);
}
void
diff --git a/include/ruby/internal/error.h b/include/ruby/internal/error.h
index dc842cc6f6..72ee622770 100644
--- a/include/ruby/internal/error.h
+++ b/include/ruby/internal/error.h
@@ -29,6 +29,13 @@ RBIMPL_SYMBOL_EXPORT_BEGIN()
VALUE rb_errinfo(void);
void rb_set_errinfo(VALUE);
+typedef enum {
+ RB_WARN_CATEGORY_NONE,
+ RB_WARN_CATEGORY_DEPRECATED,
+ RB_WARN_CATEGORY_EXPERIMENTAL,
+ RB_WARN_CATEGORY_ALL_BITS = 0x6 /* no RB_WARN_CATEGORY_NONE bit */
+} rb_warning_category_t;
+
/* for rb_readwrite_sys_fail first argument */
enum rb_io_wait_readwrite {RB_IO_WAIT_READABLE, RB_IO_WAIT_WRITABLE};
#define RB_IO_WAIT_READABLE RB_IO_WAIT_READABLE
@@ -63,12 +70,12 @@ VALUE *rb_ruby_debug_ptr(void);
/* reports if `-W' specified */
PRINTF_ARGS(void rb_warning(const char*, ...), 1, 2);
-PRINTF_ARGS(void rb_category_warning(const char*, const char*, ...), 2, 3);
+PRINTF_ARGS(void rb_category_warning(rb_warning_category_t category, const char*, ...), 2, 3);
PRINTF_ARGS(void rb_compile_warning(const char *, int, const char*, ...), 3, 4);
PRINTF_ARGS(void rb_sys_warning(const char*, ...), 1, 2);
/* reports always */
COLDFUNC PRINTF_ARGS(void rb_warn(const char*, ...), 1, 2);
-COLDFUNC PRINTF_ARGS(void rb_category_warn(const char *, const char*, ...), 2, 3);
+COLDFUNC PRINTF_ARGS(void rb_category_warn(rb_warning_category_t category, const char*, ...), 2, 3);
PRINTF_ARGS(void rb_compile_warn(const char *, int, const char*, ...), 3, 4);
RBIMPL_SYMBOL_EXPORT_END()
diff --git a/internal/error.h b/internal/error.h
index cf6495fbd0..0dd629f052 100644
--- a/internal/error.h
+++ b/internal/error.h
@@ -40,13 +40,6 @@
#endif
/* error.c */
-typedef enum {
- RB_WARN_CATEGORY_NONE,
- RB_WARN_CATEGORY_DEPRECATED,
- RB_WARN_CATEGORY_EXPERIMENTAL,
- RB_WARN_CATEGORY_ALL_BITS = 0x6, /* no RB_WARN_CATEGORY_NONE bit */
-} rb_warning_category_t;
-
extern long rb_backtrace_length_limit;
extern VALUE rb_eEAGAIN;
extern VALUE rb_eEWOULDBLOCK;