df8127a17e
Attempt to address issue #386. unique_code_id's have been removed and replaced with a pointer to the "raw code" information. This pointer is stored in the actual byte code (aligned, so the GC can trace it), so that raw code (ie byte code, native code and inline assembler) is kept only for as long as it is needed. In memory it's now like a tree: the outer module's byte code points directly to its children's raw code. So when the outer code gets freed, if there are no remaining functions that need the raw code, then the children's code gets freed as well. This is pretty much like CPython does it, except that CPython stores indexes in the byte code rather than machine pointers. These indices index the per-function constant table in order to find the relevant code.
65 lines
2.8 KiB
C
65 lines
2.8 KiB
C
typedef enum {
|
|
MP_VM_RETURN_NORMAL,
|
|
MP_VM_RETURN_YIELD,
|
|
MP_VM_RETURN_EXCEPTION,
|
|
} mp_vm_return_kind_t;
|
|
|
|
void mp_init(void);
|
|
void mp_deinit(void);
|
|
|
|
void mp_check_nargs(int n_args, machine_uint_t n_args_min, machine_uint_t n_args_max, int n_kw, bool is_kw);
|
|
|
|
mp_obj_dict_t *mp_locals_get(void);
|
|
void mp_locals_set(mp_obj_dict_t *d);
|
|
mp_obj_dict_t *mp_globals_get(void);
|
|
void mp_globals_set(mp_obj_dict_t *d);
|
|
|
|
mp_obj_t mp_load_name(qstr qstr);
|
|
mp_obj_t mp_load_global(qstr qstr);
|
|
mp_obj_t mp_load_build_class(void);
|
|
void mp_store_name(qstr qstr, mp_obj_t obj);
|
|
void mp_store_global(qstr qstr, mp_obj_t obj);
|
|
void mp_delete_name(qstr qstr);
|
|
void mp_delete_global(qstr qstr);
|
|
|
|
mp_obj_t mp_unary_op(int op, mp_obj_t arg);
|
|
mp_obj_t mp_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs);
|
|
|
|
mp_obj_t mp_load_const_dec(qstr qstr);
|
|
mp_obj_t mp_load_const_str(qstr qstr);
|
|
mp_obj_t mp_load_const_bytes(qstr qstr);
|
|
|
|
mp_obj_t mp_make_function_n(int n_args, void *fun); // fun must have the correct signature for n_args fixed arguments
|
|
mp_obj_t mp_make_function_var(int n_args_min, mp_fun_var_t fun);
|
|
mp_obj_t mp_make_function_var_between(int n_args_min, int n_args_max, mp_fun_var_t fun); // min and max are inclusive
|
|
|
|
mp_obj_t mp_call_function_0(mp_obj_t fun);
|
|
mp_obj_t mp_call_function_1(mp_obj_t fun, mp_obj_t arg);
|
|
mp_obj_t mp_call_function_2(mp_obj_t fun, mp_obj_t arg1, mp_obj_t arg2);
|
|
mp_obj_t mp_call_function_n_kw_for_native(mp_obj_t fun_in, uint n_args_kw, const mp_obj_t *args);
|
|
mp_obj_t mp_call_function_n_kw(mp_obj_t fun, uint n_args, uint n_kw, const mp_obj_t *args);
|
|
mp_obj_t mp_call_method_n_kw(uint n_args, uint n_kw, const mp_obj_t *args);
|
|
mp_obj_t mp_call_method_n_kw_var(bool have_self, uint n_args_n_kw, const mp_obj_t *args);
|
|
|
|
void mp_unpack_sequence(mp_obj_t seq, uint num, mp_obj_t *items);
|
|
void mp_unpack_ex(mp_obj_t seq, uint num, mp_obj_t *items);
|
|
mp_obj_t mp_store_map(mp_obj_t map, mp_obj_t key, mp_obj_t value);
|
|
mp_obj_t mp_load_attr(mp_obj_t base, qstr attr);
|
|
void mp_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest);
|
|
void mp_load_method_maybe(mp_obj_t base, qstr attr, mp_obj_t *dest);
|
|
void mp_store_attr(mp_obj_t base, qstr attr, mp_obj_t val);
|
|
void mp_store_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t val);
|
|
|
|
mp_obj_t mp_getiter(mp_obj_t o);
|
|
mp_obj_t mp_iternext_allow_raise(mp_obj_t o); // may return MP_OBJ_NULL instead of raising StopIteration()
|
|
mp_obj_t mp_iternext(mp_obj_t o); // will always return MP_OBJ_NULL instead of raising StopIteration(...)
|
|
mp_vm_return_kind_t mp_resume(mp_obj_t self_in, mp_obj_t send_value, mp_obj_t throw_value, mp_obj_t *ret_val);
|
|
|
|
mp_obj_t mp_make_raise_obj(mp_obj_t o);
|
|
|
|
extern mp_obj_t mp_sys_path;
|
|
mp_map_t *mp_loaded_modules_get(void);
|
|
mp_obj_t mp_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level);
|
|
mp_obj_t mp_import_from(mp_obj_t module, qstr name);
|
|
void mp_import_all(mp_obj_t module);
|