diff options
author | Damien George <damien.p.george@gmail.com> | 2014-10-25 15:07:02 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-10-25 20:23:13 +0100 |
commit | 1084b0f9c21b093618da4494508dec9ca8467e35 (patch) | |
tree | e21a6e19240346b6a449b432cbf961d7839fba4b /py/objfun.h | |
parent | fcff4663dd5bd33eed931c7731fd133f49551b4b (diff) |
py: Store bytecode arg names in bytecode (were in own array).
This saves a lot of RAM for 2 reasons:
1. For functions that don't have default values, var args or var kw
args (which is a large number of functions in the general case), the
mp_obj_fun_bc_t type now fits in 1 GC block (previously needed 2 because
of the extra pointer to point to the arg_names array). So this saves 16
bytes per function (32 bytes on 64-bit machines).
2. Combining separate memory regions generally saves RAM because the
unused bytes at the end of the GC block are saved for 1 of the blocks
(since that block doesn't exist on its own anymore). So generally this
saves 8 bytes per function.
Tested by importing lots of modules:
- 64-bit Linux gave about an 8% RAM saving for 86k of used RAM.
- pyboard gave about a 6% RAM saving for 31k of used RAM.
Diffstat (limited to 'py/objfun.h')
-rw-r--r-- | py/objfun.h | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/py/objfun.h b/py/objfun.h index cc8035ef3..e23fe8d52 100644 --- a/py/objfun.h +++ b/py/objfun.h @@ -27,14 +27,13 @@ typedef struct _mp_obj_fun_bc_t { mp_obj_base_t base; mp_obj_dict_t *globals; // the context within which this function was defined - mp_uint_t n_pos_args : 16; // number of arguments this function takes - mp_uint_t n_kwonly_args : 16; // number of arguments this function takes - mp_uint_t n_def_args : 16; // number of default arguments + mp_uint_t n_pos_args : 8; // number of arguments this function takes + mp_uint_t n_kwonly_args : 8; // number of keyword-only arguments this function takes + mp_uint_t n_def_args : 8; // number of default arguments mp_uint_t has_def_kw_args : 1; // set if this function has default keyword args mp_uint_t takes_var_args : 1; // set if this function takes variable args mp_uint_t takes_kw_args : 1; // set if this function takes keyword args const byte *bytecode; // bytecode for the function - qstr *args; // argument names (needed to resolve positional args passed as keywords) // the following extra_args array is allocated space to take (in order): // - values of positional default args (if any) // - a single slot for default kw args dict (if it has them) |