mirror of https://github.com/arendst/Tasmota.git
Berry `math.inf`, `math.isinf()` and fixed json ouput for `inf` and `nan` (#21304)
This commit is contained in:
parent
5b5fdb0afe
commit
fd148a8d12
|
@ -26,6 +26,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- LVGL fix memory allocation of flush buffers
|
- LVGL fix memory allocation of flush buffers
|
||||||
- Berry `web_add_handler` called before `Webserver` is initialized
|
- Berry `web_add_handler` called before `Webserver` is initialized
|
||||||
- Put back wifi IPv6 workaround
|
- Put back wifi IPv6 workaround
|
||||||
|
- Berry `math.inf`, `math.isinf()` and fixed json ouput for `inf` and `nan`
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- LVGL disabled vector graphics
|
- LVGL disabled vector graphics
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "be_object.h"
|
#include "be_object.h"
|
||||||
#include "be_mem.h"
|
#include "be_mem.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#if BE_USE_JSON_MODULE
|
#if BE_USE_JSON_MODULE
|
||||||
|
|
||||||
|
@ -515,6 +516,15 @@ static void value_dump(bvm *vm, int *indent, int idx, int fmt)
|
||||||
} else if (be_isnil(vm, idx)) { /* convert to json null */
|
} else if (be_isnil(vm, idx)) { /* convert to json null */
|
||||||
be_stack_require(vm, 1 + BE_STACK_FREE_MIN);
|
be_stack_require(vm, 1 + BE_STACK_FREE_MIN);
|
||||||
be_pushstring(vm, "null");
|
be_pushstring(vm, "null");
|
||||||
|
} else if (be_isreal(vm, idx)) {
|
||||||
|
be_stack_require(vm, 1 + BE_STACK_FREE_MIN);
|
||||||
|
breal v = be_toreal(vm, idx);
|
||||||
|
if (isnan(v) || isinf(v)) {
|
||||||
|
be_pushstring(vm, "null");
|
||||||
|
} else {
|
||||||
|
be_tostring(vm, idx);
|
||||||
|
be_pushvalue(vm, idx); /* push to top */
|
||||||
|
};
|
||||||
} else if (be_isnumber(vm, idx) || be_isbool(vm, idx)) { /* convert to json number and boolean */
|
} else if (be_isnumber(vm, idx) || be_isbool(vm, idx)) { /* convert to json number and boolean */
|
||||||
be_stack_require(vm, 1 + BE_STACK_FREE_MIN);
|
be_stack_require(vm, 1 + BE_STACK_FREE_MIN);
|
||||||
be_tostring(vm, idx);
|
be_tostring(vm, idx);
|
||||||
|
|
|
@ -45,6 +45,17 @@ static int m_isnan(bvm *vm)
|
||||||
be_return(vm);
|
be_return(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int m_isinf(bvm *vm)
|
||||||
|
{
|
||||||
|
if (be_top(vm) >= 1 && be_isreal(vm, 1)) {
|
||||||
|
breal x = be_toreal(vm, 1);
|
||||||
|
be_pushbool(vm, isinf(x));
|
||||||
|
} else {
|
||||||
|
be_pushbool(vm, bfalse);
|
||||||
|
}
|
||||||
|
be_return(vm);
|
||||||
|
}
|
||||||
|
|
||||||
static int m_abs(bvm *vm)
|
static int m_abs(bvm *vm)
|
||||||
{
|
{
|
||||||
if (be_top(vm) >= 1 && be_isnumber(vm, 1)) {
|
if (be_top(vm) >= 1 && be_isnumber(vm, 1)) {
|
||||||
|
@ -284,6 +295,7 @@ static int m_rand(bvm *vm)
|
||||||
#if !BE_USE_PRECOMPILED_OBJECT
|
#if !BE_USE_PRECOMPILED_OBJECT
|
||||||
be_native_module_attr_table(math) {
|
be_native_module_attr_table(math) {
|
||||||
be_native_module_function("isnan", m_isnan),
|
be_native_module_function("isnan", m_isnan),
|
||||||
|
be_native_module_function("isinf", m_isinf),
|
||||||
be_native_module_function("abs", m_abs),
|
be_native_module_function("abs", m_abs),
|
||||||
be_native_module_function("ceil", m_ceil),
|
be_native_module_function("ceil", m_ceil),
|
||||||
be_native_module_function("floor", m_floor),
|
be_native_module_function("floor", m_floor),
|
||||||
|
@ -308,6 +320,7 @@ be_native_module_attr_table(math) {
|
||||||
be_native_module_function("rand", m_rand),
|
be_native_module_function("rand", m_rand),
|
||||||
be_native_module_real("pi", M_PI),
|
be_native_module_real("pi", M_PI),
|
||||||
be_native_module_real("nan", NAN),
|
be_native_module_real("nan", NAN),
|
||||||
|
be_native_module_real("inf", INFINITY),
|
||||||
be_native_module_int("imax", M_IMAX),
|
be_native_module_int("imax", M_IMAX),
|
||||||
be_native_module_int("imin", M_IMIN),
|
be_native_module_int("imin", M_IMIN),
|
||||||
};
|
};
|
||||||
|
@ -317,6 +330,7 @@ be_define_native_module(math, NULL);
|
||||||
/* @const_object_info_begin
|
/* @const_object_info_begin
|
||||||
module math (scope: global, depend: BE_USE_MATH_MODULE) {
|
module math (scope: global, depend: BE_USE_MATH_MODULE) {
|
||||||
isnan, func(m_isnan)
|
isnan, func(m_isnan)
|
||||||
|
isinf, func(m_isinf)
|
||||||
abs, func(m_abs)
|
abs, func(m_abs)
|
||||||
ceil, func(m_ceil)
|
ceil, func(m_ceil)
|
||||||
floor, func(m_floor)
|
floor, func(m_floor)
|
||||||
|
@ -341,6 +355,7 @@ module math (scope: global, depend: BE_USE_MATH_MODULE) {
|
||||||
rand, func(m_rand)
|
rand, func(m_rand)
|
||||||
pi, real(M_PI)
|
pi, real(M_PI)
|
||||||
nan, real(NAN)
|
nan, real(NAN)
|
||||||
|
inf, real(INFINITY)
|
||||||
imax, int(M_IMAX)
|
imax, int(M_IMAX)
|
||||||
imin, int(M_IMIN)
|
imin, int(M_IMIN)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,5 +10,37 @@ assert(math.isnan(n*0))
|
||||||
|
|
||||||
assert(!math.isnan(0))
|
assert(!math.isnan(0))
|
||||||
assert(!math.isnan(1.5))
|
assert(!math.isnan(1.5))
|
||||||
|
assert(!math.isnan(math.inf))
|
||||||
|
|
||||||
assert(n != n) #- nan is never identical to itself -#
|
assert(n != n) #- nan is never identical to itself -#
|
||||||
|
|
||||||
|
#- inf -#
|
||||||
|
i = math.inf
|
||||||
|
assert(str(i) == 'inf')
|
||||||
|
assert(str(-i) == '-inf') # inf has a sign
|
||||||
|
assert(math.isinf(i))
|
||||||
|
assert(math.isinf(i+i))
|
||||||
|
assert(math.isinf(i+1))
|
||||||
|
# the following result in nan
|
||||||
|
assert(math.isnan(i*0))
|
||||||
|
assert(math.isnan(i-i))
|
||||||
|
assert(math.isnan(i/i))
|
||||||
|
|
||||||
|
assert(!math.isinf(0))
|
||||||
|
assert(!math.isinf(1.5))
|
||||||
|
assert(!math.isinf(math.nan))
|
||||||
|
|
||||||
|
assert(i == i) #- equality works for inf -#
|
||||||
|
assert(i == i+1)
|
||||||
|
|
||||||
|
#- nan and inf convert to null in json -#
|
||||||
|
import json
|
||||||
|
|
||||||
|
m_nan = {"v": math.nan}
|
||||||
|
assert(json.dump(m_nan) == '{"v":null}')
|
||||||
|
m_inf1 = {"v": math.inf}
|
||||||
|
assert(json.dump(m_inf1) == '{"v":null}')
|
||||||
|
m_inf2 = {"v": -math.inf}
|
||||||
|
assert(json.dump(m_inf2) == '{"v":null}')
|
||||||
|
m_v = {"v": 3.5}
|
||||||
|
assert(json.dump(m_v) == '{"v":3.5}')
|
||||||
|
|
Loading…
Reference in New Issue