diff options
Diffstat (limited to 'py/emit.h')
-rw-r--r-- | py/emit.h | 116 |
1 files changed, 104 insertions, 12 deletions
@@ -1,8 +1,3 @@ -//#define EMIT_DO_CPY -#define EMIT_DO_BC -//#define EMIT_DO_X64 -//#define EMIT_DO_THUMB - /* Notes on passes: * We don't know exactly the opcodes in pass 1 because they depend on the * closing over of variables (LOAD_CLOSURE, BUILD_TUPLE, MAKE_CLOSURE), which @@ -19,15 +14,111 @@ typedef enum { PASS_3 = 3, // emit code } pass_kind_t; -typedef struct _emitter_t emitter_t; +typedef struct _emit_t emit_t; + +typedef struct _emit_method_table_t { + void (*set_native_types)(emit_t *emit, bool do_native_types); + void (*start_pass)(emit_t *emit, pass_kind_t pass, scope_t *scope); + void (*end_pass)(emit_t *emit); + bool (*last_emit_was_return_value)(emit_t *emit); + int (*get_stack_size)(emit_t *emit); + void (*set_stack_size)(emit_t *emit, int size); + + int (*label_new)(emit_t *emit); + void (*label_assign)(emit_t *emit, int l); + void (*import_name)(emit_t *emit, qstr qstr); + void (*import_from)(emit_t *emit, qstr qstr); + void (*import_star)(emit_t *emit); + void (*load_const_tok)(emit_t *emit, py_token_kind_t tok); + void (*load_const_small_int)(emit_t *emit, int arg); + void (*load_const_int)(emit_t *emit, qstr qstr); + void (*load_const_dec)(emit_t *emit, qstr qstr); + void (*load_const_id)(emit_t *emit, qstr qstr); + void (*load_const_str)(emit_t *emit, qstr qstr, bool bytes); + void (*load_const_verbatim_start)(emit_t *emit); + void (*load_const_verbatim_int)(emit_t *emit, int val); + void (*load_const_verbatim_str)(emit_t *emit, const char *str); + void (*load_const_verbatim_strn)(emit_t *emit, const char *str, int len); + void (*load_const_verbatim_quoted_str)(emit_t *emit, qstr qstr, bool bytes); + void (*load_const_verbatim_end)(emit_t *emit); + void (*load_fast)(emit_t *emit, qstr qstr, int local_num); + void (*load_name)(emit_t *emit, qstr qstr); + void (*load_global)(emit_t *emit, qstr qstr); + void (*load_deref)(emit_t *emit, qstr qstr); + void (*load_closure)(emit_t *emit, qstr qstr); + void (*load_attr)(emit_t *emit, qstr qstr); + void (*load_method)(emit_t *emit, qstr qstr); + void (*load_build_class)(emit_t *emit); + void (*store_fast)(emit_t *emit, qstr qstr, int local_num); + void (*store_name)(emit_t *emit, qstr qstr); + void (*store_global)(emit_t *emit, qstr qstr); + void (*store_deref)(emit_t *emit, qstr qstr); + void (*store_attr)(emit_t *emit, qstr qstr); + void (*store_locals)(emit_t *emit); + void (*store_subscr)(emit_t *emit); + void (*delete_fast)(emit_t *emit, qstr qstr, int local_num); + void (*delete_name)(emit_t *emit, qstr qstr); + void (*delete_global)(emit_t *emit, qstr qstr); + void (*delete_deref)(emit_t *emit, qstr qstr); + void (*delete_attr)(emit_t *emit, qstr qstr); + void (*delete_subscr)(emit_t *emit); + void (*dup_top)(emit_t *emit); + void (*dup_top_two)(emit_t *emit); + void (*pop_top)(emit_t *emit); + void (*rot_two)(emit_t *emit); + void (*rot_three)(emit_t *emit); + void (*jump)(emit_t *emit, int label); + void (*pop_jump_if_true)(emit_t *emit, int label); + void (*pop_jump_if_false)(emit_t *emit, int label); + void (*jump_if_true_or_pop)(emit_t *emit, int label); + void (*jump_if_false_or_pop)(emit_t *emit, int label); + void (*setup_loop)(emit_t *emit, int label); + void (*break_loop)(emit_t *emit, int label); + void (*continue_loop)(emit_t *emit, int label); + void (*setup_with)(emit_t *emit, int label); + void (*with_cleanup)(emit_t *emit); + void (*setup_except)(emit_t *emit, int label); + void (*setup_finally)(emit_t *emit, int label); + void (*end_finally)(emit_t *emit); + void (*get_iter)(emit_t *emit); // tos = getiter(tos) + void (*for_iter)(emit_t *emit, int label); + void (*for_iter_end)(emit_t *emit); + void (*pop_block)(emit_t *emit); + void (*pop_except)(emit_t *emit); + void (*unary_op)(emit_t *emit, rt_unary_op_t op); + void (*binary_op)(emit_t *emit, rt_binary_op_t op); + void (*compare_op)(emit_t *emit, rt_compare_op_t op); + void (*build_tuple)(emit_t *emit, int n_args); + void (*build_list)(emit_t *emit, int n_args); + void (*list_append)(emit_t *emit, int list_stack_index); + void (*build_map)(emit_t *emit, int n_args); + void (*store_map)(emit_t *emit); + void (*map_add)(emit_t *emit, int map_stack_index); + void (*build_set)(emit_t *emit, int n_args); + void (*set_add)(emit_t *emit, int set_stack_index); + void (*build_slice)(emit_t *emit, int n_args); + void (*unpack_sequence)(emit_t *emit, int n_args); + void (*unpack_ex)(emit_t *emit, int n_left, int n_right); + void (*make_function)(emit_t *emit, scope_t *scope, int n_dict_params, int n_default_params); + void (*make_closure)(emit_t *emit, scope_t *scope, int n_dict_params, int n_default_params); + void (*call_function)(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg); + void (*call_method)(emit_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg); + void (*return_value)(emit_t *emit); + void (*raise_varargs)(emit_t *emit, int n_args); + void (*yield_value)(emit_t *emit); + void (*yield_from)(emit_t *emit); +} emit_method_table_t; + +void emit_common_load_id(pass_kind_t pass, scope_t *scope, emit_t *emit, const emit_method_table_t *emit_method_table, qstr qstr___class__, qstr qstr); +void emit_common_store_id(pass_kind_t pass, scope_t *scope, emit_t *emit, const emit_method_table_t *emit_method_table, qstr qstr); +void emit_common_delete_id(pass_kind_t pass, scope_t *scope, emit_t *emit, const emit_method_table_t *emit_method_table, qstr qstr); -void emit_common_declare_global(pass_kind_t pass, scope_t *scope, qstr qstr); -void emit_common_declare_nonlocal(pass_kind_t pass, scope_t *scope, qstr qstr); -void emit_common_load_id(pass_kind_t pass, scope_t *scope, qstr qstr___class__, emitter_t *emit, qstr qstr); -void emit_common_store_id(pass_kind_t pass, scope_t *scope, emitter_t *emit, qstr qstr); -void emit_common_delete_id(pass_kind_t pass, scope_t *scope, emitter_t *emit, qstr qstr); +void emit_new_cpython(emit_t **emit, const emit_method_table_t **emit_method_table); +void emit_new_bc(emit_t **emit, const emit_method_table_t **emit_method_table); +void emit_new_x64(emit_t **emit, const emit_method_table_t **emit_method_table); +void emit_new_thumb(emit_t **emit, const emit_method_table_t **emit_method_table); -emitter_t *emit_new(); +/* void emit_set_native_types(emitter_t *emit, bool do_native_types); void emit_start_pass(emitter_t *emit, pass_kind_t pass, scope_t *scope); void emit_end_pass(emitter_t *emit); @@ -118,3 +209,4 @@ void emit_return_value(emitter_t *emit); void emit_raise_varargs(emitter_t *emit, int n_args); void emit_yield_value(emitter_t *emit); void emit_yield_from(emitter_t *emit); +*/ |