Native & viper failures with setjmp exception handling
Port, board and/or hardware
unix
MicroPython version
MicroPython v1.26.0-preview.169.g429478dcfc.dirty on 2025-06-02; linux [GCC 12.2.0] version
(modified from v1.26.0-preview-166-gc0111e63b3)
Reproduction
- grab my branch at https://github.com/jepler/circuitpython/tree/coverage-setjmp
- in ports/unix
make VARIANT=coverage_setjmp test
Expected behaviour
Expected all tests to pass
Observed behaviour
The native_gen.py test fails with a segfault. This is the minimized version of the crashing code:
# catching an exception from .throw()
@micropython.native
def gen3():
try:
yield 1
except Exception as er:
print("caught", repr(er))
g = gen3()
print(g.throw(ValueError(42)))
Additional Information
The branch above has 3 changes:
- introduce a unix variant that uses setjmp for exception handling
- fix a build error in
mp_native_yield_from - turns on N_NLR_SETJMP in emitnative whenever MICROPY_NLR_SETJMP is enabled and N_NLR_SETJMP is not otherwise used (note: this fixes other errors in
make testthat occur with MICROPY_NLR_SETJMP enabled)
It is vaguely possible that my change in mp_native_yield_from is wrong and I considered whether it might contribute to the crash, but in my reduced testcase a gdb breakpoint on that function isn't hit so I don't think that's it.
Code of Conduct
Yes, I agree
mpy-cross: Assertion failed for `-march=debug` and Viper code
Port, board and/or hardware
mpy-cross on Linux/amd64
MicroPython version
MicroPython v1.26.0-preview.196.g5f058e986 on 2025-06-09; linux [GCC 15.1.1] version
Reproduction
- Build
mpy-crosswithout any special flags or parameters (as in,make -C mpy-cross clean && make -C mpy-cross - Run
./mpy-cross/build/mpy-cross -march=debug ./tests/micropython/viper_ptr16_store.py
Expected behaviour
mpy-cross should not crash on exit but terminate gracefully.
Observed behaviour
mpy-cross will crash with:
mpy-cross: ../py/asmbase.c:56: mp_asm_base_start_pass: Assertion `as->code_base != NULL' failed.
after dumping native meta-opcodes to STDOUT.
Additional Information
This only happens for Viper code. For example, dumping tests/micropython/native_closure.py or tests/micropython/meminfo.py doesn't trigger the assertion.
I haven't really looked into this, but it seems like Viper code would still trigger an emit pass even for the debug arch? This could probably be fixed if N_DEBUG would be propagated into py/asmbase.c too but it doesn't seem to be the case.
Code of Conduct
Yes, I agree