From d72370def72c74ca98c1ec4eb7b58ba0fbcc9629 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 9 Dec 2017 10:57:40 +0200 Subject: [PATCH] py/objfun, vm: Add comments on codestate allocation in stackless mode. --- py/objfun.c | 6 +++++- py/vm.c | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/py/objfun.c b/py/objfun.c index 445f25d46b..e27413e40a 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 564200037a..e6679729b2 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