ruby-changes:3470
From: ko1@a...
Date: 9 Jan 2008 14:52:36 +0900
Subject: [ruby-changes:3470] nobu - Ruby:r14963 (trunk): * string.c (rb_enc_cr_str_buf_cat, rb_str_buf_append): deal with self
nobu 2008-01-09 14:52:20 +0900 (Wed, 09 Jan 2008) New Revision: 14963 Modified files: trunk/ChangeLog trunk/string.c Log: * string.c (rb_enc_cr_str_buf_cat, rb_str_buf_append): deal with self appending. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=14963&r2=14962&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14963&r2=14962&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 14962) +++ ChangeLog (revision 14963) @@ -1,3 +1,8 @@ +Wed Jan 9 14:52:18 2008 Nobuyoshi Nakada <nobu@r...> + + * string.c (rb_enc_cr_str_buf_cat, rb_str_buf_append): deal with self + appending. + Wed Jan 9 14:44:57 2008 NAKAMURA Usaku <usa@r...> * parse.y (parser_prepare): set parser->enc from lex_input for ripper. Index: string.c =================================================================== --- string.c (revision 14962) +++ string.c (revision 14963) @@ -1061,7 +1061,7 @@ rb_enc_cr_str_buf_cat(VALUE str, const char *ptr, long len, int ptr_encindex, int ptr_cr, int *ptr_cr_ret) { - long capa, total; + long capa, total, off = -1; int str_encindex = ENCODING_GET(str); int res_encindex; @@ -1128,7 +1128,13 @@ if (len < 0) { rb_raise(rb_eArgError, "negative string size (or size too big)"); } + if (ptr >= RSTRING_PTR(str) && ptr <= RSTRING_END(str)) { + off = ptr - RSTRING_PTR(str); + } rb_str_modify(str); + if (off != -1) { + ptr = RSTRING_PTR(str) + off; + } if (len == 0) { ENCODING_CODERANGE_SET(str, res_encindex, res_cr); return str; @@ -1170,10 +1176,6 @@ { int str2_cr; - if (str == str2) { - str2 = rb_str_dup(str2); - } - str2_cr = ENC_CODERANGE(str2); rb_enc_cr_str_buf_cat(str, RSTRING_PTR(str2), RSTRING_LEN(str2), -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml