diff options
Diffstat (limited to 'py')
-rw-r--r-- | py/objfun.c | 6 | ||||
-rw-r--r-- | py/vm.c | 12 |
2 files changed, 17 insertions, 1 deletions
diff --git a/py/objfun.c b/py/objfun.c index 445f25d46..e27413e40 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -218,8 +218,12 @@ mp_code_state_t *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, size_t n_args size_t n_state, state_size; DECODE_CODESTATE_SIZE(self->bytecode, n_state, state_size); - // allocate state for locals and stack mp_code_state_t *code_state; + // If we use m_new_obj_var(), then on no memory, MemoryError will be + // raised. But this is not correct exception for a function call, + // RuntimeError should be raised instead. So, we use m_new_obj_var_maybe(), + // return NULL, then vm.c takes the needed action (either raise + // RuntimeError or fallback to stack allocation). code_state = m_new_obj_var_maybe(mp_code_state_t, byte, state_size); if (!code_state) { return NULL; @@ -937,6 +937,9 @@ unwind_jump:; deep_recursion_error: mp_exc_recursion_depth(); } + #else + // If we couldn't allocate codestate on heap, in + // non non-strict case fall thru to stack allocation. #endif } #endif @@ -974,6 +977,9 @@ unwind_jump:; else { goto deep_recursion_error; } + #else + // If we couldn't allocate codestate on heap, in + // non non-strict case fall thru to stack allocation. #endif } #endif @@ -1008,6 +1014,9 @@ unwind_jump:; else { goto deep_recursion_error; } + #else + // If we couldn't allocate codestate on heap, in + // non non-strict case fall thru to stack allocation. #endif } #endif @@ -1045,6 +1054,9 @@ unwind_jump:; else { goto deep_recursion_error; } + #else + // If we couldn't allocate codestate on heap, in + // non non-strict case fall thru to stack allocation. #endif } #endif |