Commit 7450fc8b authored by Kenton Varda's avatar Kenton Varda

Fixes #90. The bug causes floating-point fields with non-zero defaults to be…

Fixes #90. The bug causes floating-point fields with non-zero defaults to be corrupted if they are set to NaN on a MIPS machine.
parent 55a16ee8
...@@ -1685,13 +1685,27 @@ TEST(Encoding, NameAnnotation) { ...@@ -1685,13 +1685,27 @@ TEST(Encoding, NameAnnotation) {
EXPECT_FALSE(nestedFieldBuilder.hasAnotherGoodNestedFieldName()); EXPECT_FALSE(nestedFieldBuilder.hasAnotherGoodNestedFieldName());
EXPECT_FALSE(root.getRenamedUnion().isRenamedGroup()); EXPECT_FALSE(root.getRenamedUnion().isRenamedGroup());
auto renamedGroupBuilder = root.getRenamedUnion().initRenamedGroup(); auto renamedGroupBuilder KJ_UNUSED = root.getRenamedUnion().initRenamedGroup();
EXPECT_TRUE(root.getRenamedUnion().isRenamedGroup()); EXPECT_TRUE(root.getRenamedUnion().isRenamedGroup());
test::RenamedInterface::RenamedMethodParams::Reader renamedInterfaceParams; test::RenamedInterface::RenamedMethodParams::Reader renamedInterfaceParams;
renamedInterfaceParams.getRenamedParam(); renamedInterfaceParams.getRenamedParam();
} }
TEST(Encoding, DefaultFloatPlusNan) {
MallocMessageBuilder message;
auto root = message.initRoot<TestDefaults>();
root.setFloat32Field(kj::nan());
root.setFloat64Field(kj::nan());
float f = root.getFloat32Field();
EXPECT_TRUE(f != f);
double d = root.getFloat64Field();
EXPECT_TRUE(d != d);
}
} // namespace } // namespace
} // namespace _ (private) } // namespace _ (private)
} // namespace capnp } // namespace capnp
...@@ -266,7 +266,7 @@ template <> ...@@ -266,7 +266,7 @@ template <>
inline uint32_t mask<float>(float value, uint32_t mask) { inline uint32_t mask<float>(float value, uint32_t mask) {
#if CAPNP_CANONICALIZE_NAN #if CAPNP_CANONICALIZE_NAN
if (value != value) { if (value != value) {
return 0x7fc00000u; return 0x7fc00000u ^ mask;
} }
#endif #endif
...@@ -280,7 +280,7 @@ template <> ...@@ -280,7 +280,7 @@ template <>
inline uint64_t mask<double>(double value, uint64_t mask) { inline uint64_t mask<double>(double value, uint64_t mask) {
#if CAPNP_CANONICALIZE_NAN #if CAPNP_CANONICALIZE_NAN
if (value != value) { if (value != value) {
return 0x7ff8000000000000ull; return 0x7ff8000000000000ull ^ mask;
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment