summaryrefslogtreecommitdiffhomepage
path: root/src/error.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-07-02 14:24:20 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-07-02 14:24:20 +0900
commit040d1799ecadaf4cca83d8e250c3ca268a363e09 (patch)
treec3903e115d89dd8ec535e858d24d092dcab95452 /src/error.c
parente60ddc431d242ede15e8f4d59a1a815fac532dc6 (diff)
downloadmruby-040d1799ecadaf4cca83d8e250c3ca268a363e09.tar.gz
mruby-040d1799ecadaf4cca83d8e250c3ca268a363e09.zip
error.c: `mrb_obj_as_string` and `mrb_inspect` may return non-object (`undef`).
Diffstat (limited to 'src/error.c')
-rw-r--r--src/error.c16
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);
}