ruby-changes:13483
From: nobu <ko1@a...>
Date: Thu, 8 Oct 2009 02:46:49 +0900 (JST)
Subject: [ruby-changes:13483] Ruby:r25259 (trunk): * string.c (rb_str_inspect): copy by chunks.
nobu 2009-10-08 02:46:34 +0900 (Thu, 08 Oct 2009) New Revision: 25259 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25259 Log: * string.c (rb_str_inspect): copy by chunks. Modified files: trunk/ChangeLog trunk/string.c Index: ChangeLog =================================================================== --- ChangeLog (revision 25258) +++ ChangeLog (revision 25259) @@ -1,3 +1,7 @@ +Thu Oct 8 02:46:24 2009 Nobuyoshi Nakada <nobu@r...> + + * string.c (rb_str_inspect): copy by chunks. + Thu Oct 8 01:23:18 2009 Nobuyoshi Nakada <nobu@r...> * iseq.c (iseq_s_disasm): accept proc objects. [ruby-core:18762] Index: string.c =================================================================== --- string.c (revision 25258) +++ string.c (revision 25259) @@ -4068,7 +4068,7 @@ rb_str_inspect(VALUE str) { rb_encoding *enc = STR_ENC_GET(str); - char *p, *pend; + const char *p, *pend, *prev; #define CHAR_ESC_LEN 12 /* sizeof(\x{ hex of 32bit unsigned int }) */ char buf[CHAR_ESC_LEN + 1]; VALUE result = rb_str_buf_new(0); @@ -4081,15 +4081,17 @@ str_buf_cat2(result, "\""); p = RSTRING_PTR(str); pend = RSTRING_END(str); + prev = p; while (p < pend) { unsigned int c, cc; int n; n = rb_enc_precise_mbclen(p, pend, enc); if (!MBCLEN_CHARFOUND_P(n)) { + if (p > prev) str_buf_cat(result, prev, p - prev); snprintf(buf, CHAR_ESC_LEN, "\\x%02X", *p & 0377); str_buf_cat(result, buf, strlen(buf)); - p++; + prev = ++p; continue; } n = MBCLEN_CHARFOUND_LEN(n); @@ -4101,38 +4103,36 @@ MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) && (cc = rb_enc_codepoint(p,pend,enc), (cc == '$' || cc == '@' || cc == '{')))) { + if (p - n > prev) str_buf_cat(result, prev, p - n - prev); str_buf_cat2(result, "\\"); - str_buf_cat(result, p - n, n); + prev = p - n; + continue; } - else if (c == '\n') { - str_buf_cat2(result, "\\n"); + switch (c) { + case '\n': cc = 'n'; break; + case '\r': cc = 'r'; break; + case '\t': cc = 't'; break; + case '\f': cc = 'f'; break; + case '\013': cc = 'v'; break; + case '\010': cc = 'b'; break; + case '\007': cc = 'a'; break; + case 033: cc = 'e'; break; + default: cc = 0; break; } - else if (c == '\r') { - str_buf_cat2(result, "\\r"); + if (cc) { + if (p - n > prev) str_buf_cat(result, prev, p - n - prev); + buf[0] = '\\'; + buf[1] = (char)cc; + str_buf_cat(result, buf, 2); + prev = p; + continue; } - else if (c == '\t') { - str_buf_cat2(result, "\\t"); + if ((enc == resenc && rb_enc_isprint(c, enc)) || + (rb_enc_isascii(c, enc) && ISPRINT(c))) { + continue; } - else if (c == '\f') { - str_buf_cat2(result, "\\f"); - } - else if (c == '\013') { - str_buf_cat2(result, "\\v"); - } - else if (c == '\010') { - str_buf_cat2(result, "\\b"); - } - else if (c == '\007') { - str_buf_cat2(result, "\\a"); - } - else if (c == 033) { - str_buf_cat2(result, "\\e"); - } - else if ((enc == resenc && rb_enc_isprint(c, enc)) || - (rb_enc_isascii(c, enc) && ISPRINT(c))) { - str_buf_cat(result, p-n, n); - } else { + if (p - n > prev) str_buf_cat(result, prev, p - n - prev); if (unicode_p) { if (c < 0x10000) { snprintf(buf, CHAR_ESC_LEN, "\\u%04X", c); @@ -4151,8 +4151,11 @@ } str_buf_cat(result, buf, strlen(buf)); } + prev = p; + continue; } } + if (p > prev) str_buf_cat(result, prev, p - prev); str_buf_cat2(result, "\""); OBJ_INFECT(result, str); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/