From a7739219026e9b175949a322f9d88c4abb71b346 Mon Sep 17 00:00:00 2001 From: Nathan Sashihara <21227491+n8sh@users.noreply.github.com> Date: Mon, 22 Jan 2018 12:31:36 -0500 Subject: [PATCH] Fix Issue 18279 - rt.util.utf does not properly reserve buffer in toUTF16/toUTF16z --- src/rt/util/utf.d | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/rt/util/utf.d b/src/rt/util/utf.d index 8c0eed2be1..daa1028434 100644 --- a/src/rt/util/utf.d +++ b/src/rt/util/utf.d @@ -723,8 +723,14 @@ wstring toUTF16(in char[] s) wchar[] r; size_t slen = s.length; - r.length = slen; - r.length = 0; + if (!__ctfe) + { + // Reserve still does a lot if slen is zero. + // Return early for that case. + if (0 == slen) + return ""w; + r.reserve(slen); + } for (size_t i = 0; i < slen; ) { dchar c = s[i]; @@ -750,8 +756,14 @@ wptr toUTF16z(in char[] s) wchar[] r; size_t slen = s.length; - r.length = slen + 1; - r.length = 0; + if (!__ctfe) + { + // Reserve still does a lot if slen is zero. + // Return early for that case. + if (0 == slen) + return &"\0"w[0]; + r.reserve(slen + 1); + } for (size_t i = 0; i < slen; ) { dchar c = s[i]; @@ -789,8 +801,14 @@ wstring toUTF16(in dchar[] s) wchar[] r; size_t slen = s.length; - r.length = slen; - r.length = 0; + if (!__ctfe) + { + // Reserve still does a lot if slen is zero. + // Return early for that case. + if (0 == slen) + return ""w; + r.reserve(slen); + } for (size_t i = 0; i < slen; i++) { encode(r, s[i]);