summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-12 12:56:21 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-12 12:56:21 +0900
commitff4925b804cc70aa8571e9aed2793114ef0223f6 (patch)
tree4095de3172d5e454a32b3f8f084bb1708e0f64dd
parent5937c29281d9bf51ca85b79c8f3dea204909a073 (diff)
downloadmruby-ff4925b804cc70aa8571e9aed2793114ef0223f6.tar.gz
mruby-ff4925b804cc70aa8571e9aed2793114ef0223f6.zip
corrupted String#inspect on backslash escapes
-rw-r--r--src/string.c9
1 files changed, 1 insertions, 8 deletions
diff --git a/src/string.c b/src/string.c
index fae3392cf..fcd68a2f2 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2943,18 +2943,15 @@ mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2)
mrb_value
mrb_str_inspect(mrb_state *mrb, mrb_value str)
{
- const char *p, *pend, *prev;
+ const char *p, *pend;
char buf[CHAR_ESC_LEN + 1];
mrb_value result = mrb_str_new_cstr(mrb, "\"");
p = RSTRING_PTR(str); pend = RSTRING_END(str);
- prev = p;
for (;p < pend; p++) {
unsigned int c, cc;
- int n;
c = *p;
- n = 1;
if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) {
buf[0] = '\\'; buf[1] = c;
mrb_str_buf_cat(mrb, result, buf, 2);
@@ -2977,18 +2974,14 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str)
default: cc = 0; break;
}
if (cc) {
- if (p - n > prev) mrb_str_buf_cat(mrb, result, prev, p - n - prev);
buf[0] = '\\';
buf[1] = (char)cc;
mrb_str_buf_cat(mrb, result, buf, 2);
- prev = p;
continue;
}
else {
- if (p - n > prev) mrb_str_buf_cat(mrb, result, prev, p - n - prev);
sprintf(buf, "\\%03o", c & 0377);
mrb_str_buf_cat(mrb, result, buf, strlen(buf));
- prev = p;
continue;
}
}