diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-06-28 12:03:53 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-06-28 12:03:53 +0900 |
| commit | f0abd4241f2a8087db4c460cf4b1f531c17c1404 (patch) | |
| tree | 3e47e2fd72ea7a0672f835f3ea6fec834b10b9b9 /mrbgems/mruby-sprintf | |
| parent | 3554a41a5445cb8e89d365ac27bed3139e055047 (diff) | |
| download | mruby-f0abd4241f2a8087db4c460cf4b1f531c17c1404.tar.gz mruby-f0abd4241f2a8087db4c460cf4b1f531c17c1404.zip | |
Avoid `mrb_funcall()` unless absolutely necessary; ref #3722
As a result, `#chr` is not called for ch < 0x80, so we need to
update the "invalid chr" test.
Diffstat (limited to 'mrbgems/mruby-sprintf')
| -rw-r--r-- | mrbgems/mruby-sprintf/src/sprintf.c | 16 | ||||
| -rw-r--r-- | mrbgems/mruby-sprintf/test/sprintf.rb | 2 |
2 files changed, 14 insertions, 4 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index b1dfabbc2..b270ba298 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -701,17 +701,27 @@ retry: tmp = mrb_check_string_type(mrb, val); if (!mrb_nil_p(tmp)) { - if (mrb_fixnum(mrb_funcall(mrb, tmp, "size", 0)) != 1 ) { + if (RSTRING_LEN(tmp) != 1) { mrb_raise(mrb, E_ARGUMENT_ERROR, "%c requires a character"); } } else if (mrb_fixnum_p(val)) { - tmp = mrb_funcall(mrb, val, "chr", 0); + mrb_int n = mrb_fixnum(val); + + if (n < 0x80) { + char buf[1]; + + buf[0] = (char)n; + tmp = mrb_str_new(mrb, buf, 1); + } + else { + tmp = mrb_funcall(mrb, val, "chr", 0); + mrb_check_type(mrb, tmp, MRB_TT_STRING); + } } else { mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character"); } - mrb_check_type(mrb, tmp, MRB_TT_STRING); c = RSTRING_PTR(tmp); n = RSTRING_LEN(tmp); if (!(flags & FWIDTH)) { diff --git a/mrbgems/mruby-sprintf/test/sprintf.rb b/mrbgems/mruby-sprintf/test/sprintf.rb index 2c4a7f7a9..89620606b 100644 --- a/mrbgems/mruby-sprintf/test/sprintf.rb +++ b/mrbgems/mruby-sprintf/test/sprintf.rb @@ -75,7 +75,7 @@ assert("String#% with invalid chr") do end assert_raise TypeError do - "%c" % 0 + "%c" % 0x80 end ensure class Fixnum |
