From ad6c58972cefd5c0193b0693ceab83f5bc2e23fa Mon Sep 17 00:00:00 2001 From: KOBAYASHI Shuji Date: Thu, 31 Oct 2019 22:04:56 +0900 Subject: Set `MRB_STR_ASCII` flag to some stringize methods - `Fixnum#to_s`, `Fixnum#inspect` - `Float#to_s`, `Float#inspect` - `NilClass#to_s`, `NilClass#inspect` - `FalseClass#to_s`, `FalseClass#inspect` - `TrueClass#to_s`, `TrueClass#inspect` - `Time#to_s`, `Time#inspect` --- mrbgems/mruby-time/src/time.c | 5 ++++- src/numeric.c | 27 +++++++++++++++++++-------- src/object.c | 16 ++++++++++++---- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c index caa8a01b5..c6680056a 100644 --- a/mrbgems/mruby-time/src/time.c +++ b/mrbgems/mruby-time/src/time.c @@ -12,6 +12,7 @@ #include #include #include +#include #ifndef MRB_DISABLE_STDIO #include @@ -952,7 +953,9 @@ mrb_time_to_s(mrb_state *mrb, mrb_value self) struct mrb_time *tm = time_get_ptr(mrb, self); mrb_bool utc = tm->timezone == MRB_TIMEZONE_UTC; size_t len = (utc ? time_to_s_utc : time_to_s_local)(mrb, tm, buf, sizeof(buf)); - return mrb_str_new(mrb, buf, len); + mrb_value str = mrb_str_new(mrb, buf, len); + RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } void diff --git a/src/numeric.c b/src/numeric.c index 60925841f..306b6ef4d 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -210,26 +210,30 @@ static mrb_value flo_to_s(mrb_state *mrb, mrb_value flt) { mrb_float f = mrb_float(flt); + mrb_value str; if (isinf(f)) { - return f < 0 ? mrb_str_new_lit(mrb, "-Infinity") - : mrb_str_new_lit(mrb, "Infinity"); + str = f < 0 ? mrb_str_new_lit(mrb, "-Infinity") + : mrb_str_new_lit(mrb, "Infinity"); + goto exit; } else if (isnan(f)) { - return mrb_str_new_lit(mrb, "NaN"); + str = mrb_str_new_lit(mrb, "NaN"); + goto exit; } else { char fmt[] = "%." MRB_STRINGIZE(FLO_TO_STR_PREC) "g"; - mrb_value str = mrb_float_to_str(mrb, flt, fmt); mrb_int len; char *begp, *p, *endp; + str = mrb_float_to_str(mrb, flt, fmt); + insert_dot_zero: begp = RSTRING_PTR(str); len = RSTRING_LEN(str); for (p = begp, endp = p + len; p < endp; ++p) { if (*p == '.') { - return str; + goto exit; } else if (*p == 'e') { ptrdiff_t e_pos = p - begp; @@ -237,7 +241,7 @@ flo_to_s(mrb_state *mrb, mrb_value flt) p = RSTRING_PTR(str) + e_pos; memmove(p + 2, p, len - e_pos); memcpy(p, ".0", 2); - return str; + goto exit; } } @@ -247,8 +251,12 @@ flo_to_s(mrb_state *mrb, mrb_value flt) goto insert_dot_zero; } - return str; + goto exit; } + + exit: + RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } /* 15.2.9.3.2 */ @@ -1383,6 +1391,7 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base) char buf[MRB_INT_BIT+1]; char *b = buf + sizeof buf; mrb_int val = mrb_fixnum(x); + mrb_value str; if (base < 2 || 36 < base) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %i", base); @@ -1403,7 +1412,9 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base) } while (val /= base); } - return mrb_str_new(mrb, b, buf + sizeof(buf) - b); + str = mrb_str_new(mrb, b, buf + sizeof(buf) - b); + RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } /* 15.2.8.3.25 */ diff --git a/src/object.c b/src/object.c index 33d570331..8de42a641 100644 --- a/src/object.c +++ b/src/object.c @@ -83,13 +83,17 @@ mrb_true(mrb_state *mrb, mrb_value obj) static mrb_value nil_to_s(mrb_state *mrb, mrb_value obj) { - return mrb_str_new_frozen(mrb, 0, 0); + mrb_value str = mrb_str_new_frozen(mrb, 0, 0); + RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } static mrb_value nil_inspect(mrb_state *mrb, mrb_value obj) { - return mrb_str_new_lit_frozen(mrb, "nil"); + mrb_value str = mrb_str_new_lit_frozen(mrb, "nil"); + RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } /*********************************************************************** @@ -150,7 +154,9 @@ true_xor(mrb_state *mrb, mrb_value obj) static mrb_value true_to_s(mrb_state *mrb, mrb_value obj) { - return mrb_str_new_lit_frozen(mrb, "true"); + mrb_value str = mrb_str_new_lit_frozen(mrb, "true"); + RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } /* 15.2.5.3.4 */ @@ -257,7 +263,9 @@ false_or(mrb_state *mrb, mrb_value obj) static mrb_value false_to_s(mrb_state *mrb, mrb_value obj) { - return mrb_str_new_lit_frozen(mrb, "false"); + mrb_value str = mrb_str_new_lit_frozen(mrb, "false"); + RSTR_SET_ASCII_FLAG(mrb_str_ptr(str)); + return str; } void -- cgit v1.2.3