Fix #19107 (#19286) [backport]

This commit is contained in:
Tomohiro
2021-12-25 18:31:35 +09:00
committed by GitHub
parent fa96e56ad0
commit fdbec969d8

View File

@@ -574,6 +574,9 @@ template formatValue(result: var string; value: cstring; specifier: string) =
result.add value
proc strformatImpl(f: string; openChar, closeChar: char): NimNode =
template missingCloseChar =
error("invalid format string: missing closing character '" & closeChar & "'")
if openChar == ':' or closeChar == ':':
error "openChar and closeChar must not be ':'"
var i = 0
@@ -618,6 +621,8 @@ proc strformatImpl(f: string; openChar, closeChar: char): NimNode =
let start = i
inc i
i += f.skipWhitespace(i)
if i == f.len:
missingCloseChar
if f[i] == closeChar or f[i] == ':':
result.add newCall(bindSym"add", res, newLit(subexpr & f[start ..< i]))
else:
@@ -627,6 +632,9 @@ proc strformatImpl(f: string; openChar, closeChar: char): NimNode =
subexpr.add f[i]
inc i
if i == f.len:
missingCloseChar
var x: NimNode
try:
x = parseExpr(subexpr)
@@ -639,10 +647,10 @@ proc strformatImpl(f: string; openChar, closeChar: char): NimNode =
while i < f.len and f[i] != closeChar:
options.add f[i]
inc i
if i == f.len:
missingCloseChar
if f[i] == closeChar:
inc i
else:
doAssert false, "invalid format string: missing '}'"
result.add newCall(formatSym, res, x, newLit(options))
elif f[i] == closeChar:
if i<f.len-1 and f[i+1] == closeChar: