Skip to content

Commit 38664ea

Browse files
committed
Fixed msgpack#1087 for C++.
Treat signaling NaN correctly. Introduced f32 to preserve signaling/quiet NaN. Updated zlib on CI.
1 parent b2f056c commit 38664ea

File tree

10 files changed

+305
-19
lines changed

10 files changed

+305
-19
lines changed

.github/depends/zlib.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ while getopts "b:t:p:" c; do
2727
done
2828

2929
mkdir $prefix || exit 1
30-
wget https://zlib.net/zlib-1.2.13.tar.gz || exit 1
31-
tar -xf zlib-1.2.13.tar.gz || exit 1
32-
cd zlib-1.2.13
30+
wget https://zlib.net/zlib-1.3.tar.gz || exit 1
31+
tar -xf zlib-1.3.tar.gz || exit 1
32+
cd zlib-1.3
3333

3434
build()
3535
{

appveyor.yml

+7-7
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ environment:
2323
boost_subdir: lib32-msvc-14.0
2424
build_script:
2525
- ps: |
26-
appveyor DownloadFile http://zlib.net/zlib-1.2.13.tar.gz -FileName zlib-1.2.13.tar.gz
27-
7z x zlib-1.2.13.tar.gz 2> $null
28-
7z x zlib-1.2.13.tar 2> $null
29-
cd zlib-1.2.13
26+
appveyor DownloadFile http://zlib.net/zlib-1.3.tar.gz -FileName zlib-1.3.tar.gz
27+
7z x zlib-1.3.tar.gz 2> $null
28+
7z x zlib-1.3.tar 2> $null
29+
cd zlib-1.3
3030
3131
md build
3232
md prefix
3333
cd build
3434
3535
cmake `
3636
-G $env:msvc `
37-
-D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\zlib-1.2.13\prefix" `
37+
-D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\zlib-1.3\prefix" `
3838
..
3939
if ($LastExitCode -ne 0) { exit $LastExitCode }
4040
@@ -52,7 +52,7 @@ build_script:
5252
-D MSGPACK_BUILD_EXAMPLES=ON `
5353
-D MSGPACK_BUILD_TESTS=ON `
5454
-D CMAKE_EXE_LINKER_FLAGS=/LIBPATH:"$env:boost_prefix\$env:boost_subdir" `
55-
-D CMAKE_PREFIX_PATH="$env:boost_prefix;$env:APPVEYOR_BUILD_FOLDER\zlib-1.2.13\prefix" `
55+
-D CMAKE_PREFIX_PATH="$env:boost_prefix;$env:APPVEYOR_BUILD_FOLDER\zlib-1.3\prefix" `
5656
-D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\prefix" `
5757
-D CMAKE_CXX_FLAGS="/D_VARIADIC_MAX=10 /EHsc /DBOOST_ALL_DYN_LINK" `
5858
..
@@ -62,5 +62,5 @@ build_script:
6262
if ($LastExitCode -ne 0) { exit $LastExitCode }
6363
6464
test_script:
65-
- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release;%boost_prefix%\%boost_subdir%
65+
- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\zlib-1.3\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release;%boost_prefix%\%boost_subdir%
6666
- ctest -VV -C Release

include/msgpack/v1/adaptor/float.hpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ namespace adaptor {
2727
template <>
2828
struct convert<float> {
2929
msgpack::object const& operator()(msgpack::object const& o, float& v) const {
30-
if(o.type == msgpack::type::FLOAT32 || o.type == msgpack::type::FLOAT64) {
30+
if(o.type == msgpack::type::FLOAT32) {
31+
v = o.via.f32;
32+
}
33+
else if (o.type == msgpack::type::FLOAT64) {
3134
v = static_cast<float>(o.via.f64);
3235
}
3336
else if (o.type == msgpack::type::POSITIVE_INTEGER) {
@@ -56,7 +59,10 @@ struct pack<float> {
5659
template <>
5760
struct convert<double> {
5861
msgpack::object const& operator()(msgpack::object const& o, double& v) const {
59-
if(o.type == msgpack::type::FLOAT32 || o.type == msgpack::type::FLOAT64) {
62+
if (o.type == msgpack::type::FLOAT32) {
63+
v = static_cast<double>(o.via.f32);
64+
}
65+
else if (o.type == msgpack::type::FLOAT64) {
6066
v = o.via.f64;
6167
}
6268
else if (o.type == msgpack::type::POSITIVE_INTEGER) {
@@ -86,7 +92,7 @@ template <>
8692
struct object<float> {
8793
void operator()(msgpack::object& o, float v) const {
8894
o.type = msgpack::type::FLOAT32;
89-
o.via.f64 = static_cast<double>(v);
95+
o.via.f32 = v;
9096
}
9197
};
9298

include/msgpack/v1/object.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ class object_parser {
252252
if (!v.visit_negative_integer(m_current->via.i64)) return;
253253
break;
254254
case msgpack::type::FLOAT32:
255-
if (!v.visit_float32(static_cast<float>(m_current->via.f64))) return;
255+
if (!v.visit_float32(m_current->via.f32)) return;
256256
break;
257257
case msgpack::type::FLOAT64:
258258
if (!v.visit_float64(m_current->via.f64)) return;
@@ -717,7 +717,7 @@ struct object_with_zone<msgpack::object> {
717717
}
718718
bool visit_float32(float v) {
719719
m_ptr->type = msgpack::type::FLOAT32;
720-
m_ptr->via.f64 = v;
720+
m_ptr->via.f32 = v;
721721
return true;
722722
}
723723
bool visit_float64(double v) {
@@ -910,7 +910,7 @@ struct object_equal_visitor {
910910
return true;
911911
}
912912
bool visit_float32(float v) {
913-
if (m_ptr->type != msgpack::type::FLOAT32 || m_ptr->via.f64 != v) {
913+
if (m_ptr->type != msgpack::type::FLOAT32 || m_ptr->via.f32 != v) {
914914
m_result = false;
915915
return false;
916916
}

include/msgpack/v1/object_fwd.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ struct object {
8282
double dec; // obsolete
8383
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
8484
double f64;
85+
float f32;
8586
msgpack::object_array array;
8687
msgpack::object_map map;
8788
msgpack::object_str str;

include/msgpack/v1/unpack.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ inline void unpack_int64(int64_t d, msgpack::object& o)
9595
else { o.type = msgpack::type::NEGATIVE_INTEGER; o.via.i64 = d; } }
9696

9797
inline void unpack_float(float d, msgpack::object& o)
98-
{ o.type = msgpack::type::FLOAT32; o.via.f64 = d; }
98+
{ o.type = msgpack::type::FLOAT32; o.via.f32 = d; }
9999

100100
inline void unpack_double(double d, msgpack::object& o)
101101
{ o.type = msgpack::type::FLOAT64; o.via.f64 = d; }

include/msgpack/v2/create_object_visitor.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class create_object_visitor : public msgpack::v2::null_visitor {
9797
bool visit_float32(float v) {
9898
msgpack::object* obj = m_stack.back();
9999
obj->type = msgpack::type::FLOAT32;
100-
obj->via.f64 = v;
100+
obj->via.f32 = v;
101101
return true;
102102
}
103103
bool visit_float64(double v) {

test/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ LIST (APPEND check_PROGRAMS
2222
msgpack_stream.cpp
2323
msgpack_tuple.cpp
2424
msgpack_vref.cpp
25+
nan.cpp
2526
object.cpp
2627
object_with_zone.cpp
2728
pack_unpack.cpp

0 commit comments

Comments
 (0)