diff options
author | Damien George <damien.p.george@gmail.com> | 2014-09-04 14:44:01 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-09-04 14:44:01 +0100 |
commit | b534e1b9f14c189d2cef209d40f598e62164694a (patch) | |
tree | 04dae8bd856e98819fe34ad83a9c52ee69213087 /py/objgenerator.c | |
parent | dda46460fff56c0756adba0d63fd72b311bdbcc9 (diff) | |
download | micropython-b534e1b9f14c189d2cef209d40f598e62164694a.tar.gz micropython-b534e1b9f14c189d2cef209d40f598e62164694a.zip |
py: Use variable length encoded uints in more places in bytecode.
Code-info size, block name, source name, n_state and n_exc_stack now use
variable length encoded uints. This saves 7-9 bytes per bytecode
function for most functions.
Diffstat (limited to 'py/objgenerator.c')
-rw-r--r-- | py/objgenerator.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c index 7c364a7b2a..9d16d2bee0 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -57,15 +57,14 @@ STATIC mp_obj_t gen_wrap_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw mp_obj_fun_bc_t *self_fun = (mp_obj_fun_bc_t*)self->fun; assert(MP_OBJ_IS_TYPE(self_fun, &mp_type_fun_bc)); - const byte *bytecode = self_fun->bytecode; - // get code info size, and skip the line number table - mp_uint_t code_info_size = bytecode[0] | (bytecode[1] << 8) | (bytecode[2] << 16) | (bytecode[3] << 24); - bytecode += code_info_size; + // skip code-info block + const byte *code_info = self_fun->bytecode; + mp_uint_t code_info_size = mp_decode_uint(&code_info); + const byte *ip = self_fun->bytecode + code_info_size; // bytecode prelude: get state size and exception stack size - mp_uint_t n_state = bytecode[0] | (bytecode[1] << 8); - mp_uint_t n_exc_stack = bytecode[2] | (bytecode[3] << 8); - bytecode += 4; + mp_uint_t n_state = mp_decode_uint(&ip); + mp_uint_t n_exc_stack = mp_decode_uint(&ip); // allocate the generator object, with room for local stack and exception stack mp_obj_gen_instance_t *o = m_new_obj_var(mp_obj_gen_instance_t, byte, @@ -74,7 +73,7 @@ STATIC mp_obj_t gen_wrap_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw o->globals = self_fun->globals; o->code_state.n_state = n_state; - o->code_state.ip = bytecode; + o->code_state.ip = ip; mp_setup_code_state(&o->code_state, self_fun, n_args, n_kw, args); return o; } |