2011/5/25 Aaron Jacobs <email@example.com>
Hmm, but does it make sense to say a default constructed value is all
of null, an array, and an object? Wouldn't it make more sense to have
isArray (and only isArray) start returning true once the value is
"turned into" an array by appending something to it?
I'd appreciate if you could investigate the VC++ issues; I don't have
easy access to a Windows machine.
The unit test failures are real strange:
double x = kint64max;
double y = val.asDouble();
int count = 0;
if ( y == x ) // OK (case 1)
if ( double(kint64max) == y ) // BAD (case 2)
Looking at the assembly, the only difference I see is that in the first case the x value (kint64max) is loaded from the local variable, while in the second case it never leave the FPU register if I understand correctly. My guess is that we are stumbling into the fact that FPU register have an internal precision of 80 bits. I'm not sure how to confirm this though...
if ( y == x )
00411B97 fld qword ptr [ebp-290h]
00411B9D fcomp qword ptr [ebp-2A0h]
00411BA3 fnstsw ax
if ( double(kint64max) == y )
00411BB9 call std::numeric_limits<__int64>::max (412D60h)
00411BBE mov dword ptr [ebp-0A4Ch],eax
00411BC4 mov dword ptr [ebp-0A48h],edx
00411BCA fild qword ptr [ebp-0A4Ch]
00411BD0 fcomp qword ptr [ebp-2A0h]
00411BD6 fnstsw ax
I worked-around this by making code match case 1...
There is another kinds of test failures that occurs related to how floating pointer number are represented as string. With MSVS AFAIK we always get three digits in the exponent. Here are some examples of failures:
1>* Detail of ValueTest/integers test failure:
1>..\..\src\test_lib_json\main.cpp(582): "1.04858e+06" == val.asString()
1> Expected: '1.04858e+06'
1> Actual : '1.04858e+006'
* Test E:\prg\vc\Lib\jsoncpp-trunk\test\data\test_real_09.json
Difference in input at line 1:
The easiest is probably to normalize floating point string before comparison. What do you think?