summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-sprintf/src/sprintf.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-06-28 12:03:53 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-06-28 12:03:53 +0900
commitf0abd4241f2a8087db4c460cf4b1f531c17c1404 (patch)
tree3e47e2fd72ea7a0672f835f3ea6fec834b10b9b9 /mrbgems/mruby-sprintf/src/sprintf.c
parent3554a41a5445cb8e89d365ac27bed3139e055047 (diff)
downloadmruby-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/src/sprintf.c')
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c16
1 files changed, 13 insertions, 3 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)) {