Fix #198: integer out of range

This commit is contained in:
genotrance 2020-05-01 12:45:15 -05:00 • committed by GitHub
commit 568cfc5da6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 15 deletions

View file

@ -133,13 +133,38 @@ proc getFloatNode(number, suffix: string): PNode {.inline.} =
proc getIntNode(number, suffix: string): PNode {.inline.} =
## Get a Nim int node from a C integer expression + suffix
var
val: BiggestInt
flags: TNodeFlags
# I realize these regex are wasteful on performance, but
# couldn't come up with a better idea.
if number.contains(re"0[xX]"):
val = parseHexInt(number)
flags = {nfBase16}
elif number.contains(re"0[bB]"):
val = parseBinInt(number)
flags = {nfBase2}
elif number.contains(re"0[oO]"):
val = parseOctInt(number)
flags = {nfBase8}
else:
val = parseInt(number)
case suffix
of "u", "U":
result = newNode(nkUintLit)
of "l", "L":
result = newNode(nkInt32Lit)
# If the value doesn't fit, adjust
if val > int32.high or val < int32.low:
result = newNode(nkInt64Lit)
else:
result = newNode(nkInt32Lit)
of "ul", "UL":
result = newNode(nkUint32Lit)
# If the value doesn't fit, adjust
if val > uint32.high.BiggestInt:
result = newNode(nkUInt64Lit)
else:
result = newNode(nkUInt32Lit)
of "ll", "LL":
result = newNode(nkInt64Lit)
of "ull", "ULL":
@ -147,19 +172,8 @@ proc getIntNode(number, suffix: string): PNode {.inline.} =
else:
result = newNode(nkIntLit)
# I realize these regex are wasteful on performance, but
# couldn't come up with a better idea.
if number.contains(re"0[xX]"):
result.intVal = parseHexInt(number)
result.flags = {nfBase16}
elif number.contains(re"0[bB]"):
result.intVal = parseBinInt(number)
result.flags = {nfBase2}
elif number.contains(re"0[oO]"):
result.intVal = parseOctInt(number)
result.flags = {nfBase8}
else:
result.intVal = parseInt(number)
result.intVal = val
result.flags = flags
proc getNumNode(number, suffix: string): PNode {.inline.} =
## Convert a C number to a Nim number PNode

View file

@ -33,6 +33,9 @@ extern "C" {
#define EQ5 AVAL != BVAL
#define EQ6 AVAL == BVAL
// testing integer out of long int range
#define INT_FAST16_MIN (-9223372036854775807L-1)
#define SIZEOF sizeof(char)
#define REG_STR "regular string"
#define NOTSUPPORTEDSTR "not a " REG_STR

View file

@ -131,6 +131,8 @@ assert SIZEOF == 1
assert COERCE == 645635670332'u64
assert COERCE2 == 645635670332'i64
assert INT_FAST16_MIN == -9223372036854775807'i64 - 1
assert BINEXPR == 5
assert BOOL == true
assert MATHEXPR == -99