parseutils.nim: help the codegen produce better code

This commit is contained in:
Araq 2019-01-16 10:05:33 +01:00
commit 1cb5e20620

View file

@ -242,8 +242,8 @@ proc captureBetween*(s: string, first: char, second = '\0', start = 0): string =
result = "" result = ""
discard s.parseUntil(result, if second == '\0': first else: second, i) discard s.parseUntil(result, if second == '\0': first else: second, i)
template integerOutOfRangeError(): ref ValueError = proc integerOutOfRangeError() {.noinline.} =
newException(ValueError, "Parsed integer outside of valid range") raise newException(ValueError, "Parsed integer outside of valid range")
proc rawParseInt(s: string, b: var BiggestInt, start = 0): int = proc rawParseInt(s: string, b: var BiggestInt, start = 0): int =
var var
@ -261,11 +261,12 @@ proc rawParseInt(s: string, b: var BiggestInt, start = 0): int =
if b >= (low(int) + c) div 10: if b >= (low(int) + c) div 10:
b = b * 10 - c b = b * 10 - c
else: else:
raise integerOutOfRangeError() integerOutOfRangeError()
inc(i) inc(i)
while i < s.len and s[i] == '_': inc(i) # underscores are allowed and ignored while i < s.len and s[i] == '_': inc(i) # underscores are allowed and ignored
if sign == -1 and b == low(int): if sign == -1 and b == low(int):
raise integerOutOfRangeError() integerOutOfRangeError()
else:
b = b * sign b = b * sign
result = i - start result = i - start
@ -290,7 +291,7 @@ proc parseInt*(s: string, number: var int, start = 0): int {.
result = parseBiggestInt(s, res, start) result = parseBiggestInt(s, res, start)
when sizeof(int) <= 4: when sizeof(int) <= 4:
if res < low(int) or res > high(int): if res < low(int) or res > high(int):
raise integerOutOfRangeError() integerOutOfRangeError()
if result != 0: if result != 0:
number = int(res) number = int(res)
@ -326,7 +327,7 @@ proc rawParseUInt(s: string, b: var BiggestUInt, start = 0): int =
prev = 0.BiggestUInt prev = 0.BiggestUInt
i = start i = start
if i < s.len - 1 and s[i] == '-' and s[i + 1] in {'0'..'9'}: if i < s.len - 1 and s[i] == '-' and s[i + 1] in {'0'..'9'}:
raise integerOutOfRangeError() integerOutOfRangeError()
if i < s.len and s[i] == '+': inc(i) # Allow if i < s.len and s[i] == '+': inc(i) # Allow
if i < s.len and s[i] in {'0'..'9'}: if i < s.len and s[i] in {'0'..'9'}:
b = 0 b = 0
@ -334,7 +335,7 @@ proc rawParseUInt(s: string, b: var BiggestUInt, start = 0): int =
prev = res prev = res
res = res * 10 + (ord(s[i]) - ord('0')).BiggestUInt res = res * 10 + (ord(s[i]) - ord('0')).BiggestUInt
if prev > res: if prev > res:
raise integerOutOfRangeError() integerOutOfRangeError()
inc(i) inc(i)
while i < s.len and s[i] == '_': inc(i) # underscores are allowed and ignored while i < s.len and s[i] == '_': inc(i) # underscores are allowed and ignored
b = res b = res
@ -361,7 +362,7 @@ proc parseUInt*(s: string, number: var uint, start = 0): int {.
result = parseBiggestUInt(s, res, start) result = parseBiggestUInt(s, res, start)
when sizeof(BiggestUInt) > sizeof(uint) and sizeof(uint) <= 4: when sizeof(BiggestUInt) > sizeof(uint) and sizeof(uint) <= 4:
if res > 0xFFFF_FFFF'u64: if res > 0xFFFF_FFFF'u64:
raise integerOutOfRangeError() integerOutOfRangeError()
if result != 0: if result != 0:
number = uint(res) number = uint(res)