From b58094c881ba2dc27dee80a09399c61a9e4ff46b Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 29 Jun 2022 15:03:41 +0900 Subject: [PATCH] mruby-sprintf/sprintf.c: call mrb_str_resize() less often. --- mrbgems/mruby-sprintf/src/sprintf.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index a562bdac1..41c84eff1 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -153,12 +153,14 @@ fmt_float(char *buf, size_t buf_size, char fmt, int flags, mrb_int width, int pr } #endif -#define CHECK(l) do { \ - while ((l) >= bsiz - blen) {\ - if (bsiz > MRB_INT_MAX/2) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \ - bsiz*=2;\ +#define CHECK(l) do { \ + if (blen+(l) >= bsiz) {\ + while (blen+(l) >= bsiz) {\ + if (bsiz > MRB_INT_MAX/2) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier");\ + bsiz*=2;\ + }\ + mrb_str_resize(mrb, result, bsiz);\ }\ - mrb_str_resize(mrb, result, bsiz);\ buf = RSTRING_PTR(result);\ } while (0)