Skip to content

Commit 4f081b5

Browse files
committed
Fixed bugs in asInt64 and asUInt64.
1 parent 3c9fdeb commit 4f081b5

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

src/lib_json/json_value.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,7 @@ Value::asInt64() const
766766
return value_.uint_;
767767
case realValue:
768768
JSON_ASSERT_MESSAGE( value_.real_ >= minInt64 && value_.real_ <= maxInt64, "Real out of Int64 range" );
769-
return Int( value_.real_ );
769+
return Int64( value_.real_ );
770770
case booleanValue:
771771
return value_.bool_ ? 1 : 0;
772772
case stringValue:
@@ -794,7 +794,7 @@ Value::asUInt64() const
794794
return value_.uint_;
795795
case realValue:
796796
JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt64, "Real out of UInt64 range" );
797-
return UInt( value_.real_ );
797+
return UInt64( value_.real_ );
798798
case booleanValue:
799799
return value_.bool_ ? 1 : 0;
800800
case stringValue:

src/test_lib_json/main.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,67 @@ JSONTEST_FIXTURE( ValueTest, integers )
427427
JSONTEST_ASSERT( double(kuint64max) == val.asDouble());
428428
JSONTEST_ASSERT( float(kuint64max) == val.asFloat());
429429
#else // ifdef JSON_NO_INT64
430+
// 2^40 (signed constructor arg)
431+
val = Json::Value(1LL << 40);
432+
433+
checks = IsCheck();
434+
checks.isInt_ = true;
435+
checks.isNumeric_ = true;
436+
checks.isIntegral_ = true;
437+
JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
438+
439+
JSONTEST_ASSERT( (1LL << 40) == val.asInt64());
440+
JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt());
441+
JSONTEST_ASSERT( (1LL << 40) == val.asUInt64());
442+
JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt());
443+
JSONTEST_ASSERT( (1LL << 40) == val.asDouble());
444+
JSONTEST_ASSERT( (1LL << 40) == val.asFloat());
445+
446+
// 2^40 (unsigned constructor arg)
447+
val = Json::Value(1ULL << 40);
448+
449+
checks = IsCheck();
450+
checks.isUInt_ = true;
451+
checks.isNumeric_ = true;
452+
checks.isIntegral_ = true;
453+
JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
454+
455+
JSONTEST_ASSERT( (1LL << 40) == val.asInt64());
456+
JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt());
457+
JSONTEST_ASSERT( (1LL << 40) == val.asUInt64());
458+
JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt());
459+
JSONTEST_ASSERT( (1LL << 40) == val.asDouble());
460+
JSONTEST_ASSERT( (1LL << 40) == val.asFloat());
461+
462+
// 2^40 (floating-point constructor arg)
463+
val = Json::Value((1LL << 40) / 1.0);
464+
465+
checks = IsCheck();
466+
checks.isDouble_ = true;
467+
checks.isNumeric_ = true;
468+
JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
469+
470+
JSONTEST_ASSERT( (1LL << 40) == val.asInt64());
471+
JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt());
472+
JSONTEST_ASSERT( (1LL << 40) == val.asUInt64());
473+
JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt());
474+
JSONTEST_ASSERT( (1LL << 40) == val.asDouble());
475+
JSONTEST_ASSERT( (1LL << 40) == val.asFloat());
476+
477+
// -2^40
478+
val = Json::Value(-(1LL << 40));
479+
480+
checks = IsCheck();
481+
checks.isInt_ = true;
482+
checks.isNumeric_ = true;
483+
checks.isIntegral_ = true;
484+
JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
485+
486+
JSONTEST_ASSERT( -(1LL << 40) == val.asInt64());
487+
JSONTEST_ASSERT( -(1LL << 40) == val.asLargestInt());
488+
JSONTEST_ASSERT( -(1LL << 40) == val.asDouble());
489+
JSONTEST_ASSERT( -(1LL << 40) == val.asFloat());
490+
430491
// int64 max
431492
val = Json::Value(Json::Int64(kint64max));
432493

0 commit comments

Comments
 (0)