From 3a6bb56029c3890d39577b96179a9f869e7cef84 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 21 Jun 2016 07:38:16 +0000 Subject: Fix garbage allocation * string.c (rb_str_casemap): do not put code with side effects inside RSTRING_PTR() macro which evaluates the argument multiple times. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55481 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index a62ae2dd8d..e4f0293bb8 100644 --- a/string.c +++ b/string.c @@ -5811,12 +5811,14 @@ rb_str_casemap(VALUE source, OnigCaseFoldType *flags, rb_encoding *enc) if (buffer_count==1) { target = rb_str_new_with_class(source, (const char*)current_buffer->space, target_length); - xfree(current_buffer); + xfree(current_buffer); } else { - char *target_current = RSTRING_PTR(target = rb_str_new_with_class(source, 0, target_length)); + char *target_current; mapping_buffer *previous_buffer; + target = rb_str_new_with_class(source, 0, target_length); + target_current = RSTRING_PTR(target); current_buffer=pre_buffer.next; while (current_buffer) { memcpy(target_current, current_buffer->space, current_buffer->used); -- cgit v1.2.3