Change Kernel#warn to call Warning.warn

This allows Warning.warn to filter/process warning messages
generated by Kernel#warn.  Currently, Warning.warn can only handle
messages generated by the rb_warn/rb_warning C functions.

The Kernel#warn API is different than the Warning.warn API, this
tries to get similar behavior, but there are probably corner cases
where the behavior is different.

This makes str_end_with_asciichar in io.c no longer static so it
can be called from error.c.

[Feature #12944]
Author:    Jeremy Evans <code@jeremyevans.net>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57370 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-01-19 06:25:06 +00:00
parent 00ed779cb0
commit 50db992a6a
2 changed files with 18 additions and 7 deletions

19
error.c
View File

@ -42,6 +42,7 @@
VALUE rb_iseqw_local_variables(VALUE iseqval); VALUE rb_iseqw_local_variables(VALUE iseqval);
VALUE rb_iseqw_new(const rb_iseq_t *); VALUE rb_iseqw_new(const rb_iseq_t *);
int rb_str_end_with_asciichar(VALUE str, int c);
VALUE rb_eEAGAIN; VALUE rb_eEAGAIN;
VALUE rb_eEWOULDBLOCK; VALUE rb_eEWOULDBLOCK;
@ -280,9 +281,11 @@ rb_enc_warning(rb_encoding *enc, const char *fmt, ...)
* call-seq: * call-seq:
* warn(msg, ...) -> nil * warn(msg, ...) -> nil
* *
* Displays each of the given messages followed by a record separator on * If warnings have been disabled (for example with the
* STDERR unless warnings have been disabled (for example with the * <code>-W0</code> flag), does nothing. Otherwise,
* <code>-W0</code> flag). * converts each of the messages to strings, appends a newline
* character to the string if the string does not end in a newline,
* and calls <code>Warning.warn</code> with the string.
* *
* warn("warning 1", "warning 2") * warn("warning 1", "warning 2")
* *
@ -296,7 +299,15 @@ static VALUE
rb_warn_m(int argc, VALUE *argv, VALUE exc) rb_warn_m(int argc, VALUE *argv, VALUE exc)
{ {
if (!NIL_P(ruby_verbose) && argc > 0) { if (!NIL_P(ruby_verbose) && argc > 0) {
rb_io_puts(argc, argv, rb_stderr); int i;
VALUE str;
for (i = 0; i < argc; i++) {
str = rb_obj_as_string(argv[i]);
if (RSTRING_LEN(str) == 0 || !rb_str_end_with_asciichar(str, '\n')) {
str = rb_str_cat(rb_str_dup(str), "\n", 1);
}
rb_write_warning_str(str);
}
} }
return Qnil; return Qnil;
} }

6
io.c
View File

@ -7124,8 +7124,8 @@ rb_f_putc(VALUE recv, VALUE ch)
} }
static int int
str_end_with_asciichar(VALUE str, int c) rb_str_end_with_asciichar(VALUE str, int c)
{ {
long len = RSTRING_LEN(str); long len = RSTRING_LEN(str);
const char *ptr = RSTRING_PTR(str); const char *ptr = RSTRING_PTR(str);
@ -7202,7 +7202,7 @@ rb_io_puts(int argc, const VALUE *argv, VALUE out)
string: string:
rb_io_write(out, line); rb_io_write(out, line);
if (RSTRING_LEN(line) == 0 || if (RSTRING_LEN(line) == 0 ||
!str_end_with_asciichar(line, '\n')) { !rb_str_end_with_asciichar(line, '\n')) {
rb_io_write(out, rb_default_rs); rb_io_write(out, rb_default_rs);
} }
} }