PKGBUILDs/community/mongodb/0006-Fix-ARM-alignment-problems.patch
2014-02-04 15:38:10 +00:00

67 lines
2 KiB
Diff

From: Robie Basak <robie.basak@canonical.com>
Date: Sat, 20 Apr 2013 22:05:50 -0300
Subject: Fix ARM alignment problems
This is a temporary workaround. We avoid double alignment issues by using
memcpy to make sure that all doubles are aligned before accessing them.
Last-Update: 2013-03-15
---
src/mongo/bson/bsonelement.h | 16 +++++++++++++++-
src/mongo/db/key.cpp | 2 +-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/mongo/bson/bsonelement.h b/src/mongo/bson/bsonelement.h
index f094ab9..1ecb47f 100644
--- a/src/mongo/bson/bsonelement.h
+++ b/src/mongo/bson/bsonelement.h
@@ -17,7 +17,7 @@
#pragma once
-#include <string.h> // strlen
+#include <string.h> // strlen, memcpy
#include <string>
#include <vector>
@@ -529,13 +529,27 @@ namespace mongo {
}
inline double BSONElement::numberDouble() const {
+#if defined(__arm__)
+ int int_result;
+ long long long_long_result;
+#endif
switch( type() ) {
case NumberDouble:
return _numberDouble();
case NumberInt:
+#if defined(__arm__)
+ memcpy(&int_result, value(), sizeof(int_result));
+ return int_result;
+#else
return *reinterpret_cast< const int* >( value() );
+#endif
case NumberLong:
+#if defined(__arm__)
+ memcpy(&long_long_result, value(), sizeof(long_long_result));
+ return (double)long_long_result;
+#else
return (double) *reinterpret_cast< const long long* >( value() );
+#endif
default:
return 0;
}
diff --git a/src/mongo/db/key.cpp b/src/mongo/db/key.cpp
index 3d9eaa7..95959d8 100644
--- a/src/mongo/db/key.cpp
+++ b/src/mongo/db/key.cpp
@@ -406,7 +406,7 @@ namespace mongo {
p += 8;
break;
case cdouble:
- b.append("", (double&) *p);
+ b.append("", (reinterpret_cast< const PackedDouble& >(*p)).d);
p += sizeof(double);
break;
case cint: