From 2e6d073be11b6d365739f1cccefbcfe3055d8da7 Mon Sep 17 00:00:00 2001 From: andri lim Date: Mon, 30 Jul 2018 17:04:49 +0700 Subject: [PATCH] fixes #8468, stdlib.encodings.convert not crash anymore on windows (#8470) --- lib/pure/encodings.nim | 8 ++++---- tests/stdlib/tencoding.nim | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 tests/stdlib/tencoding.nim diff --git a/lib/pure/encodings.nim b/lib/pure/encodings.nim index c67cd7579c..3c1cf73f4a 100644 --- a/lib/pure/encodings.nim +++ b/lib/pure/encodings.nim @@ -332,7 +332,7 @@ when defined(windows): if s.len == 0: return "" # educated guess of capacity: var cap = s.len + s.len shr 2 - result = newStringOfCap(cap*2) + result = newString(cap*2) # convert to utf-16 LE var m = multiByteToWideChar(codePage = c.src, dwFlags = 0'i32, lpMultiByteStr = cstring(s), @@ -347,7 +347,7 @@ when defined(windows): lpWideCharStr = nil, cchWideChar = cint(0)) # and do the conversion properly: - result = newStringOfCap(cap*2) + result = newString(cap*2) m = multiByteToWideChar(codePage = c.src, dwFlags = 0'i32, lpMultiByteStr = cstring(s), cbMultiByte = cint(s.len), @@ -364,7 +364,7 @@ when defined(windows): if int(c.dest) == 1200: return # otherwise the fun starts again: cap = s.len + s.len shr 2 - var res = newStringOfCap(cap) + var res = newString(cap) m = wideCharToMultiByte( codePage = c.dest, dwFlags = 0'i32, @@ -382,7 +382,7 @@ when defined(windows): lpMultiByteStr = nil, cbMultiByte = cint(0)) # and do the conversion properly: - res = newStringOfCap(cap) + res = newString(cap) m = wideCharToMultiByte( codePage = c.dest, dwFlags = 0'i32, diff --git a/tests/stdlib/tencoding.nim b/tests/stdlib/tencoding.nim new file mode 100644 index 0000000000..d6ff7ab329 --- /dev/null +++ b/tests/stdlib/tencoding.nim @@ -0,0 +1,21 @@ +discard """ + output: '''OK''' +""" + +#bug #8468 + +import encodings, strutils + +when defined(windows): + var utf16to8 = open(destEncoding = "utf-16", srcEncoding = "utf-8") + var s = "some string" + var c = utf16to8.convert(s) + + var z = newStringOfCap(s.len * 2) + for x in s: + z.add x + z.add chr(0) + + doAssert z == c + +echo "OK"