forked from bblanchon/ArduinoJson
Disabled alignment on AVR (fixes #1231)
This commit is contained in:
@ -8,6 +8,7 @@ HEAD
|
|||||||
* Fixed "statement is unreachable" warning on IAR (issue #1233)
|
* Fixed "statement is unreachable" warning on IAR (issue #1233)
|
||||||
* Fixed "pointless integer comparison" warning on IAR (issue #1233)
|
* Fixed "pointless integer comparison" warning on IAR (issue #1233)
|
||||||
* Added CMake "install" target (issue #1209)
|
* Added CMake "install" target (issue #1209)
|
||||||
|
* Disabled alignment on AVR (issue #1231)
|
||||||
|
|
||||||
v6.15.0 (2020-03-22)
|
v6.15.0 (2020-03-22)
|
||||||
-------
|
-------
|
||||||
|
@ -9,17 +9,19 @@ add_executable(MixedConfigurationTests
|
|||||||
cpp11.cpp
|
cpp11.cpp
|
||||||
decode_unicode_0.cpp
|
decode_unicode_0.cpp
|
||||||
decode_unicode_1.cpp
|
decode_unicode_1.cpp
|
||||||
|
enable_alignment_0.cpp
|
||||||
|
enable_alignment_1.cpp
|
||||||
|
enable_comments_0.cpp
|
||||||
|
enable_comments_1.cpp
|
||||||
enable_infinity_0.cpp
|
enable_infinity_0.cpp
|
||||||
enable_infinity_1.cpp
|
enable_infinity_1.cpp
|
||||||
enable_nan_0.cpp
|
enable_nan_0.cpp
|
||||||
enable_nan_1.cpp
|
enable_nan_1.cpp
|
||||||
|
enable_progmem_1.cpp
|
||||||
use_double_0.cpp
|
use_double_0.cpp
|
||||||
use_double_1.cpp
|
use_double_1.cpp
|
||||||
use_long_long_0.cpp
|
use_long_long_0.cpp
|
||||||
use_long_long_1.cpp
|
use_long_long_1.cpp
|
||||||
enable_progmem_1.cpp
|
|
||||||
enable_comments_1.cpp
|
|
||||||
enable_comments_0.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(MixedConfigurationTests
|
target_link_libraries(MixedConfigurationTests
|
||||||
|
41
extras/tests/MixedConfiguration/enable_alignment_0.cpp
Normal file
41
extras/tests/MixedConfiguration/enable_alignment_0.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#define ARDUINOJSON_NAMESPACE ArduinoJson_NoAlignment
|
||||||
|
#define ARDUINOJSON_ENABLE_ALIGNMENT 0
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
#include <catch.hpp>
|
||||||
|
|
||||||
|
TEST_CASE("ARDUINOJSON_ENABLE_ALIGNMENT == 0") {
|
||||||
|
using namespace ARDUINOJSON_NAMESPACE;
|
||||||
|
|
||||||
|
const size_t N = sizeof(void*);
|
||||||
|
|
||||||
|
SECTION("isAligned()") {
|
||||||
|
CHECK(isAligned(0) == true);
|
||||||
|
CHECK(isAligned(1) == true);
|
||||||
|
CHECK(isAligned(N) == true);
|
||||||
|
CHECK(isAligned(N + 1) == true);
|
||||||
|
CHECK(isAligned(2 * N) == true);
|
||||||
|
CHECK(isAligned(2 * N + 1) == true);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("addPadding()") {
|
||||||
|
CHECK(addPadding(0) == 0);
|
||||||
|
CHECK(addPadding(1) == 1);
|
||||||
|
CHECK(addPadding(N) == N);
|
||||||
|
CHECK(addPadding(N + 1) == N + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("AddPadding<>") {
|
||||||
|
const size_t a = AddPadding<0>::value;
|
||||||
|
CHECK(a == 0);
|
||||||
|
|
||||||
|
const size_t b = AddPadding<1>::value;
|
||||||
|
CHECK(b == 1);
|
||||||
|
|
||||||
|
const size_t c = AddPadding<N>::value;
|
||||||
|
CHECK(c == N);
|
||||||
|
|
||||||
|
const size_t d = AddPadding<N + 1>::value;
|
||||||
|
CHECK(d == N + 1);
|
||||||
|
}
|
||||||
|
}
|
40
extras/tests/MixedConfiguration/enable_alignment_1.cpp
Normal file
40
extras/tests/MixedConfiguration/enable_alignment_1.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#define ARDUINOJSON_ENABLE_ALIGNMENT 1
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
#include <catch.hpp>
|
||||||
|
|
||||||
|
TEST_CASE("ARDUINOJSON_ENABLE_ALIGNMENT == 1") {
|
||||||
|
using namespace ARDUINOJSON_NAMESPACE;
|
||||||
|
|
||||||
|
const size_t N = sizeof(void*);
|
||||||
|
|
||||||
|
SECTION("isAligned()") {
|
||||||
|
CHECK(isAligned(0) == true);
|
||||||
|
CHECK(isAligned(1) == false);
|
||||||
|
CHECK(isAligned(N) == true);
|
||||||
|
CHECK(isAligned(N + 1) == false);
|
||||||
|
CHECK(isAligned(2 * N) == true);
|
||||||
|
CHECK(isAligned(2 * N + 1) == false);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("addPadding()") {
|
||||||
|
CHECK(addPadding(0) == 0);
|
||||||
|
CHECK(addPadding(1) == N);
|
||||||
|
CHECK(addPadding(N) == N);
|
||||||
|
CHECK(addPadding(N + 1) == 2 * N);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("AddPadding<>") {
|
||||||
|
const size_t a = AddPadding<0>::value;
|
||||||
|
CHECK(a == 0);
|
||||||
|
|
||||||
|
const size_t b = AddPadding<1>::value;
|
||||||
|
CHECK(b == N);
|
||||||
|
|
||||||
|
const size_t c = AddPadding<N>::value;
|
||||||
|
CHECK(c == N);
|
||||||
|
|
||||||
|
const size_t d = AddPadding<N + 1>::value;
|
||||||
|
CHECK(d == 2 * N);
|
||||||
|
}
|
||||||
|
}
|
@ -203,6 +203,14 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARDUINOJSON_ENABLE_ALIGNMENT
|
||||||
|
#if defined(__AVR)
|
||||||
|
#define ARDUINOJSON_ENABLE_ALIGNMENT 0
|
||||||
|
#else
|
||||||
|
#define ARDUINOJSON_ENABLE_ALIGNMENT 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef ARDUINOJSON_TAB
|
#ifndef ARDUINOJSON_TAB
|
||||||
#define ARDUINOJSON_TAB " "
|
#define ARDUINOJSON_TAB " "
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,9 +10,11 @@
|
|||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE {
|
namespace ARDUINOJSON_NAMESPACE {
|
||||||
|
|
||||||
inline bool isAligned(void *ptr) {
|
#if ARDUINOJSON_ENABLE_ALIGNMENT
|
||||||
|
|
||||||
|
inline bool isAligned(size_t value) {
|
||||||
const size_t mask = sizeof(void *) - 1;
|
const size_t mask = sizeof(void *) - 1;
|
||||||
size_t addr = reinterpret_cast<size_t>(ptr);
|
size_t addr = value;
|
||||||
return (addr & mask) == 0;
|
return (addr & mask) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,16 +23,38 @@ inline size_t addPadding(size_t bytes) {
|
|||||||
return (bytes + mask) & ~mask;
|
return (bytes + mask) & ~mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline T *addPadding(T *p) {
|
|
||||||
size_t address = addPadding(reinterpret_cast<size_t>(p));
|
|
||||||
return reinterpret_cast<T *>(address);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <size_t bytes>
|
template <size_t bytes>
|
||||||
struct AddPadding {
|
struct AddPadding {
|
||||||
static const size_t mask = sizeof(void *) - 1;
|
static const size_t mask = sizeof(void *) - 1;
|
||||||
static const size_t value = (bytes + mask) & ~mask;
|
static const size_t value = (bytes + mask) & ~mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
inline bool isAligned(size_t) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t addPadding(size_t bytes) {
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t bytes>
|
||||||
|
struct AddPadding {
|
||||||
|
static const size_t value = bytes;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline bool isAligned(T *ptr) {
|
||||||
|
return isAligned(reinterpret_cast<size_t>(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline T *addPadding(T *p) {
|
||||||
|
size_t address = addPadding(reinterpret_cast<size_t>(p));
|
||||||
|
return reinterpret_cast<T *>(address);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
} // namespace ARDUINOJSON_NAMESPACE
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include <ArduinoJson/Configuration.hpp>
|
#include <ArduinoJson/Configuration.hpp>
|
||||||
#include <ArduinoJson/version.hpp>
|
#include <ArduinoJson/version.hpp>
|
||||||
|
|
||||||
|
#ifndef ARDUINOJSON_NAMESPACE
|
||||||
|
|
||||||
#define ARDUINOJSON_DO_CONCAT(A, B) A##B
|
#define ARDUINOJSON_DO_CONCAT(A, B) A##B
|
||||||
#define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_DO_CONCAT(A, B)
|
#define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_DO_CONCAT(A, B)
|
||||||
#define ARDUINOJSON_CONCAT4(A, B, C, D) \
|
#define ARDUINOJSON_CONCAT4(A, B, C, D) \
|
||||||
@ -25,3 +27,5 @@
|
|||||||
ARDUINOJSON_USE_DOUBLE, ARDUINOJSON_DECODE_UNICODE, \
|
ARDUINOJSON_USE_DOUBLE, ARDUINOJSON_DECODE_UNICODE, \
|
||||||
ARDUINOJSON_ENABLE_NAN, ARDUINOJSON_ENABLE_INFINITY, \
|
ARDUINOJSON_ENABLE_NAN, ARDUINOJSON_ENABLE_INFINITY, \
|
||||||
ARDUINOJSON_ENABLE_PROGMEM, ARDUINOJSON_ENABLE_COMMENTS)
|
ARDUINOJSON_ENABLE_PROGMEM, ARDUINOJSON_ENABLE_COMMENTS)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
Reference in New Issue
Block a user