From a2e1021d7dc8040b6e0737397fe9153dcb12191d Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 30 Dec 2021 10:02:21 +0100 Subject: [PATCH] Use `pgm_read_dword()` instead of `pgm_read_float()` (issue #1433) --- extras/tests/Helpers/progmem_emulation.hpp | 4 -- .../MixedConfiguration/enable_progmem_1.cpp | 8 ++++ src/ArduinoJson/Numbers/FloatTraits.hpp | 42 +++++++++++++------ .../Polyfills/pgmspace_generic.hpp | 9 ---- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/extras/tests/Helpers/progmem_emulation.hpp b/extras/tests/Helpers/progmem_emulation.hpp index 7a977db8..23925ba9 100644 --- a/extras/tests/Helpers/progmem_emulation.hpp +++ b/extras/tests/Helpers/progmem_emulation.hpp @@ -27,10 +27,6 @@ inline void* pgm_read_ptr(const void* p) { return *reinterpret_cast(convertFlashToPtr(p)); } -inline float pgm_read_float(const void* p) { - return *reinterpret_cast(convertFlashToPtr(p)); -} - #define ARDUINOJSON_DEFINE_PROGMEM_ARRAY(type, name, value) \ static type const ARDUINOJSON_CONCAT2(name, _progmem)[] = value; \ static type const* name = reinterpret_cast( \ diff --git a/extras/tests/MixedConfiguration/enable_progmem_1.cpp b/extras/tests/MixedConfiguration/enable_progmem_1.cpp index 23e98f72..7661f628 100644 --- a/extras/tests/MixedConfiguration/enable_progmem_1.cpp +++ b/extras/tests/MixedConfiguration/enable_progmem_1.cpp @@ -50,6 +50,14 @@ TEST_CASE("Flash strings") { } } +TEST_CASE("parseNumber()") { // tables are in Flash + using ARDUINOJSON_NAMESPACE::parseNumber; + + CHECK(parseNumber("1") == 1.f); + CHECK(parseNumber("1.23") == 1.23f); + CHECK(parseNumber("-1.23e34") == -1.23e34f); +} + TEST_CASE("strlen_P") { CHECK(strlen_P(PSTR("")) == 0); CHECK(strlen_P(PSTR("a")) == 1); diff --git a/src/ArduinoJson/Numbers/FloatTraits.hpp b/src/ArduinoJson/Numbers/FloatTraits.hpp index 60b1dfd1..053feb43 100644 --- a/src/ArduinoJson/Numbers/FloatTraits.hpp +++ b/src/ArduinoJson/Numbers/FloatTraits.hpp @@ -158,24 +158,42 @@ struct FloatTraits { } static T positiveBinaryPowerOfTen(int index) { - ARDUINOJSON_DEFINE_STATIC_ARRAY( - T, factors, - ARDUINOJSON_EXPAND6({1e1f, 1e2f, 1e4f, 1e8f, 1e16f, 1e32f})); - return ARDUINOJSON_READ_STATIC_ARRAY(T, factors, index); + ARDUINOJSON_DEFINE_STATIC_ARRAY(uint32_t, factors, + ARDUINOJSON_EXPAND6({ + 0x41200000, // 1e1f + 0x42c80000, // 1e2f + 0x461c4000, // 1e4f + 0x4cbebc20, // 1e8f + 0x5a0e1bca, // 1e16f + 0x749dc5ae // 1e32f + })); + return forge(ARDUINOJSON_READ_STATIC_ARRAY(uint32_t, factors, index)); } static T negativeBinaryPowerOfTen(int index) { - ARDUINOJSON_DEFINE_STATIC_ARRAY( - T, factors, - ARDUINOJSON_EXPAND6({1e-1f, 1e-2f, 1e-4f, 1e-8f, 1e-16f, 1e-32f})); - return ARDUINOJSON_READ_STATIC_ARRAY(T, factors, index); + ARDUINOJSON_DEFINE_STATIC_ARRAY(uint32_t, factors, + ARDUINOJSON_EXPAND6({ + 0x3dcccccd, // 1e-1f + 0x3c23d70a, // 1e-2f + 0x38d1b717, // 1e-4f + 0x322bcc77, // 1e-8f + 0x24e69595, // 1e-16f + 0x0a4fb11f // 1e-32f + })); + return forge(ARDUINOJSON_READ_STATIC_ARRAY(uint32_t, factors, index)); } static T negativeBinaryPowerOfTenPlusOne(int index) { - ARDUINOJSON_DEFINE_STATIC_ARRAY( - T, factors, - ARDUINOJSON_EXPAND6({1e0f, 1e-1f, 1e-3f, 1e-7f, 1e-15f, 1e-31f})); - return ARDUINOJSON_READ_STATIC_ARRAY(T, factors, index); + ARDUINOJSON_DEFINE_STATIC_ARRAY(uint32_t, factors, + ARDUINOJSON_EXPAND6({ + 0x3f800000, // 1e0f + 0x3dcccccd, // 1e-1f + 0x3a83126f, // 1e-3f + 0x33d6bf95, // 1e-7f + 0x26901d7d, // 1e-15f + 0x0c01ceb3 // 1e-31f + })); + return forge(ARDUINOJSON_READ_STATIC_ARRAY(uint32_t, factors, index)); } static T forge(uint32_t bits) { diff --git a/src/ArduinoJson/Polyfills/pgmspace_generic.hpp b/src/ArduinoJson/Polyfills/pgmspace_generic.hpp index 070d574f..508e4c53 100644 --- a/src/ArduinoJson/Polyfills/pgmspace_generic.hpp +++ b/src/ArduinoJson/Polyfills/pgmspace_generic.hpp @@ -15,15 +15,6 @@ typename enable_if::value, T>::type pgm_read(const void* p) { return reinterpret_cast(pgm_read_ptr(p)); } -template -typename enable_if::value && - sizeof(T) == sizeof(float), // on AVR sizeof(double) == - // sizeof(float) - T>::type -pgm_read(const void* p) { - return pgm_read_float(p); -} - template typename enable_if::value, T>::type pgm_read( const void* p) {