summaryrefslogtreecommitdiff
path: root/py/objgenerator.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-09-29 23:25:08 +1000
committerDamien George <damien.p.george@gmail.com>2018-09-29 23:25:08 +1000
commitd95947b48a30f818638c3619b92110ce6d07f5e3 (patch)
treea6754c314e919019382ef87b32f5272c295b29ce /py/objgenerator.c
parentdd288904dbaaa6f085252b7457dd10e5abfdb1f2 (diff)
py/vm: When VM raises exception put exc obj at beginning of func state.
Instead of at end of state, n_state - 1. It was originally (way back in v1.0) put at the end of the state because the VM didn't have a pointer to the start. But now that the VM takes a mp_code_state_t pointer it does have a pointer to the start of the state so can put the exception object there. This commit saves about 30 bytes of code on all architectures, and, more importantly, reduces C-stack usage by a couple of words (8 bytes on Thumb2 and 16 bytes on x86-64) for every (non-generator) call of a bytecode function because fun_bc_call no longer needs to remember the n_state variable.
Diffstat (limited to 'py/objgenerator.c')
-rw-r--r--py/objgenerator.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c
index 038c15fc3..58a33d40b 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -140,9 +140,8 @@ mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_
break;
case MP_VM_RETURN_EXCEPTION: {
- size_t n_state = mp_decode_uint_value(self->code_state.fun_bc->bytecode);
self->code_state.ip = 0;
- *ret_val = self->code_state.state[n_state - 1];
+ *ret_val = self->code_state.state[0];
// PEP479: if StopIteration is raised inside a generator it is replaced with RuntimeError
if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(mp_obj_get_type(*ret_val)), MP_OBJ_FROM_PTR(&mp_type_StopIteration))) {
*ret_val = mp_obj_new_exception_msg(&mp_type_RuntimeError, "generator raised StopIteration");