Add a new MICROPY_COMP_CONST_FLOAT feature, enabled by in mpy-cross and
when compiling with MICROPY_CONFIG_ROM_LEVEL_CORE_FEATURES. The new
feature leverages the code of MICROPY_COMP_CONST_FOLDING to support folding
of floating point constants.
If MICROPY_COMP_MODULE_CONST is defined as well, math module constants are
made available at compile time. For example:
_DEG_TO_GRADIANT = const(math.pi / 180)
_INVALID_VALUE = const(math.nan)
A few corner cases had to be handled:
- The float const folding code should not fold expressions resulting into
complex results, as the mpy parser for complex immediates has
limitations.
- The constant generation code must distinguish between -0.0 and 0.0, which
are different even if C consider them as ==.
This change removes previous limitations on the use of `const()`
expressions that would result in floating point number, so the test cases
of micropython/const_error have to be updated.
Additional test cases have been added to cover the new repr() code (from a
previous commit). A few other simple test cases have been added to handle
the use of floats in `const()` expressions, but the float folding code
itself is also tested when running general float test cases, as float
expressions often get resolved at compile-time (with this change).
Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
24 lines
539 B
Python
24 lines
539 B
Python
# make sure syntax error works correctly for bad const definition
|
|
|
|
from micropython import const
|
|
|
|
|
|
def test_syntax(code):
|
|
try:
|
|
exec(code)
|
|
except SyntaxError:
|
|
print("SyntaxError")
|
|
|
|
|
|
# argument not a constant
|
|
test_syntax("a = const(x)")
|
|
|
|
# redefined constant
|
|
test_syntax("A = const(1); A = const(2)")
|
|
|
|
# these operations are not supported within const
|
|
test_syntax("A = const(1 @ 2)")
|
|
test_syntax("A = const(1 << -2)")
|
|
test_syntax("A = const(1 >> -2)")
|
|
test_syntax("A = const(1 % 0)")
|
|
test_syntax("A = const(1 // 0)")
|