summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/objfun.c6
-rw-r--r--py/vm.c12
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;
diff --git a/py/vm.c b/py/vm.c
index 564200037..e6679729b 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -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