mpy-cross: Assertion failed when compiling tests/basics/exception_chain.py.
Port, board and/or hardware
Unix on Linux/amd64
MicroPython version
MicroPython v1.26.0-preview.261.gbcc8d4ee1.dirty on 2025-06-22; linux [GCC 15.1.1] version
Reproduction
- Build mpy-cross with no special flags (
make -C mpy-cross clean && make -C mpy-cross) - Compile
tests/basics/exception_chain.pyinto native code (arch does not matter) withmpy-cross -X emit=native -march=debug tests/basics/exception_chain.py mpy-crosswill crash.
Expected behaviour
Compiling tests/basics/exception_chain.py should not crash mpy-cross.
Observed behaviour
mpy-cross crashes with:
mpy-cross: ../py/emitnative.c:2947: emit_native_raise_varargs: Assertion `n_args == 1' failed.`
Additional Information
If having a multi-arg exception is not supported for native code compilation, then an error message should be printed rather than crashing the compiler.
Code of Conduct
Yes, I agree
tests/run-tests.py: Automatically detect native arch and mpy-cross flag.
Summary
Now that some ports support multiple architectures (eg esp32 has both Xtensa and RISC-V CPUs) it's no longer possible to set mpy-cross flags based on the target, eg ./run-tests.py --target esp32. Instead this commit makes it so the -march=xxx argument to mpy-cross is detected automatically via evaluation of sys.implementation._mpy.
Testing
Ran tests on the unix port, PYBv1.0 and Pico, using --via-mpy --emit native. The mpy-cross flags were correctly determined.
Trade-offs and Alternatives
Alternatives would be:
- specify the MCU in the target, eg
--target esp32c3, but that adds more complexity torun-tests.py - have a new argument, eg
--arch risc-v, but again that adds extra complexity and a burden to the user
IMO automatic detection of the mpy-cross flags makes it easier all round to maintain and run the tests.