diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-07-02 14:24:20 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-07-02 14:24:20 +0900 |
| commit | 040d1799ecadaf4cca83d8e250c3ca268a363e09 (patch) | |
| tree | c3903e115d89dd8ec535e858d24d092dcab95452 /src | |
| parent | e60ddc431d242ede15e8f4d59a1a815fac532dc6 (diff) | |
| download | mruby-040d1799ecadaf4cca83d8e250c3ca268a363e09.tar.gz mruby-040d1799ecadaf4cca83d8e250c3ca268a363e09.zip | |
error.c: `mrb_obj_as_string` and `mrb_inspect` may return non-object (`undef`).
Diffstat (limited to 'src')
| -rw-r--r-- | src/error.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/error.c b/src/error.c index 5d9b367bd..7953deea7 100644 --- a/src/error.c +++ b/src/error.c @@ -302,6 +302,7 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap) obj = mrb_str_new(mrb, chars, len); goto L_cat_obj; } + L_cat_plain: mrb_str_cat(mrb, result, b, e - b - 1); mrb_str_cat(mrb, result, chars, len); b = ++p; @@ -325,10 +326,15 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap) obj = va_arg(ap, mrb_value); L_cat_obj: str = (inspect ? mrb_inspect : mrb_obj_as_string)(mrb, obj); - chars = RSTRING_PTR(str); - len = RSTRING_LEN(str); - inspect = FALSE; - goto L_cat; + if (mrb_type(str) != MRB_TT_STRING) { + chars = "void (no string conversion)"; + len = strlen(chars); + } + else { + chars = RSTRING_PTR(str); + len = RSTRING_LEN(str); + } + goto L_cat_plain; case 'C': cls = va_arg(ap, struct RClass*); L_cat_class: @@ -352,7 +358,7 @@ mrb_vformat(mrb_state *mrb, const char *format, va_list ap) L_cat_current: chars = p; len = 1; - goto L_cat; + goto L_cat_plain; default: mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - %%%c", *p); } |
