diff options
author | Damien George <damien@micropython.org> | 2023-09-05 18:18:47 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2023-09-14 13:03:31 +1000 |
commit | 397697aa8368f45bd0794e22a25083e9e18e3cfe (patch) | |
tree | 0a083c8d82d3ae60d2dcdfc24e59de025732f9f8 /py/persistentcode.c | |
parent | 5e122b11eaee64bbece2ace08fc3f994d5f83f2e (diff) |
py/persistentcode: Always close reader even if an exception is raised.
Fixes issue #3874.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/persistentcode.c')
-rw-r--r-- | py/persistentcode.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/py/persistentcode.c b/py/persistentcode.c index fdc87d5cc..e1218e0b8 100644 --- a/py/persistentcode.c +++ b/py/persistentcode.c @@ -391,6 +391,10 @@ STATIC mp_raw_code_t *load_raw_code(mp_reader_t *reader, mp_module_context_t *co } void mp_raw_code_load(mp_reader_t *reader, mp_compiled_module_t *cm) { + // Set exception handler to close the reader if an exception is raised. + MP_DEFINE_NLR_JUMP_CALLBACK_FUNCTION_1(ctx, reader->close, reader->data); + nlr_push_jump_callback(&ctx.callback, mp_call_function_1_from_nlr_jump_callback); + byte header[4]; read_bytes(reader, header, sizeof(header)); byte arch = MPY_FEATURE_DECODE_ARCH(header[2]); @@ -435,7 +439,8 @@ void mp_raw_code_load(mp_reader_t *reader, mp_compiled_module_t *cm) { cm->n_obj = n_obj; #endif - reader->close(reader->data); + // Deregister exception handler and close the reader. + nlr_pop_jump_callback(true); } void mp_raw_code_load_mem(const byte *buf, size_t len, mp_compiled_module_t *context) { |