diff --git a/src/vm/wren_compiler.c b/src/vm/wren_compiler.c index 5cb34063..95c470dd 100644 --- a/src/vm/wren_compiler.c +++ b/src/vm/wren_compiler.c @@ -713,11 +713,18 @@ static int readHexDigit(Parser* parser) } // Parses the numeric value of the current token. -static void makeNumber(Parser* parser) +static void makeNumber(Parser* parser, bool isHex) { errno = 0; - parser->next.value = NUM_VAL(strtod(parser->tokenStart, NULL)); + if (isHex) + { + parser->next.value = NUM_VAL((double)strtoll(parser->tokenStart, NULL, 16)); + } + else + { + parser->next.value = NUM_VAL(strtod(parser->tokenStart, NULL)); + } if (errno == ERANGE) { @@ -740,7 +747,7 @@ static void readHexNumber(Parser* parser) // Iterate over all the valid hexadecimal digits found. while (readHexDigit(parser) != -1) continue; - makeNumber(parser); + makeNumber(parser, true); } // Finishes lexing a number literal. @@ -773,7 +780,7 @@ static void readNumber(Parser* parser) while (isDigit(peekChar(parser))) nextChar(parser); } - makeNumber(parser); + makeNumber(parser, false); } // Finishes lexing an identifier. Handles reserved words.