summaryrefslogtreecommitdiff
path: root/py/persistentcode.c
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-09-05 18:18:47 +1000
committerDamien George <damien@micropython.org>2023-09-14 13:03:31 +1000
commit397697aa8368f45bd0794e22a25083e9e18e3cfe (patch)
tree0a083c8d82d3ae60d2dcdfc24e59de025732f9f8 /py/persistentcode.c
parent5e122b11eaee64bbece2ace08fc3f994d5f83f2e (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.c7
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) {