From b169dc2ea71bc8e9296de9749c42d78f80c8a633 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 12 May 2022 12:15:38 -0400 Subject: [PATCH] Fixing get_number_type() (#1819) --- include/simdjson/generic/numberparsing.h | 6 ++++++ tests/ondemand/ondemand_number_tests.cpp | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/simdjson/generic/numberparsing.h b/include/simdjson/generic/numberparsing.h index 29d254764..2583072f4 100644 --- a/include/simdjson/generic/numberparsing.h +++ b/include/simdjson/generic/numberparsing.h @@ -1067,6 +1067,11 @@ simdjson_unused simdjson_really_inline simdjson_result ge while(static_cast(*p - '0') <= 9) { p++; } if ( p == src ) { return NUMBER_ERROR; } if (jsoncharutils::is_structural_or_whitespace(*p)) { + // We have an integer. + // If the number is negative and valid, it must be a signed integer. + if(negative) { return ondemand::number_type::signed_integer; } + // We want values larger or equal to 9223372036854775808 to be unsigned + // integers, and the other values to be signed integers. int digit_count = int(p - src); if(digit_count >= 19) { const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808"); @@ -1076,6 +1081,7 @@ simdjson_unused simdjson_really_inline simdjson_result ge } return ondemand::number_type::signed_integer; } + // Hopefully, we have 'e' or 'E' or '.'. return ondemand::number_type::floating_point_number; } diff --git a/tests/ondemand/ondemand_number_tests.cpp b/tests/ondemand/ondemand_number_tests.cpp index d8054b478..0940a652a 100644 --- a/tests/ondemand/ondemand_number_tests.cpp +++ b/tests/ondemand/ondemand_number_tests.cpp @@ -197,16 +197,18 @@ namespace number_tests { bool get_number_tests() { TEST_START(); ondemand::parser parser; - padded_string docdata = R"([1.0, 3, 1, 3.1415,-13231232,9999999999999999999])"_padded; + padded_string docdata = R"([1.0, 3, 1, 3.1415,-13231232,9999999999999999999,-9223372036854775807,-9223372036854775808])"_padded; ondemand::number_type expectedtypes[] = {ondemand::number_type::floating_point_number, ondemand::number_type::signed_integer, ondemand::number_type::signed_integer, ondemand::number_type::floating_point_number, ondemand::number_type::signed_integer, - ondemand::number_type::unsigned_integer + ondemand::number_type::unsigned_integer, + ondemand::number_type::signed_integer, + ondemand::number_type::signed_integer }; - bool is_negative[] = {false, false, false, false, true, false}; - bool is_integer[] = {false, true, true, false, true, true}; + bool is_negative[] = {false, false, false, false, true, false, true, true}; + bool is_integer[] = {false, true, true, false, true, true, true, true}; ondemand::document doc; ASSERT_SUCCESS(parser.iterate(docdata).get(doc));