From 255ef3ccac984fb112e129d16ea46d5fb5225186 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 10 Feb 2010 04:05:15 +0000 Subject: * string.c (rb_str_times): backport r15514 to reduce loop overhead. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@26630 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index d3db9fca25..3df5415106 100644 --- a/string.c +++ b/string.c @@ -428,7 +428,8 @@ rb_str_times(str, times) VALUE times; { VALUE str2; - long i, len; + long n, len; + char *ptr2; len = NUM2LONG(times); if (len < 0) { @@ -439,12 +440,17 @@ rb_str_times(str, times) } str2 = rb_str_new5(str,0, len *= RSTRING(str)->len); - for (i = 0; i < len; i += RSTRING(str)->len) { - memcpy(RSTRING(str2)->ptr + i, - RSTRING(str)->ptr, RSTRING(str)->len); - } - RSTRING(str2)->ptr[RSTRING(str2)->len] = '\0'; - + ptr2 = RSTRING_PTR(str2); + if (len) { + n = RSTRING_LEN(str); + memcpy(ptr2, RSTRING_PTR(str), n); + while (n <= len/2) { + memcpy(ptr2 + n, ptr2, n); + n *= 2; + } + memcpy(ptr2 + n, ptr2, len-n); + } + ptr2[RSTRING_LEN(str2)] = '\0'; OBJ_INFECT(str2, str); return str2; -- cgit v1.2.3