Skip to content

Commit 4b03e77

Browse files
committed
Factorise EMIT_COMMON calls, mostly into emit_pass1.
1 parent 054848a commit 4b03e77

File tree

7 files changed

+108
-195
lines changed

7 files changed

+108
-195
lines changed

py/compile.c

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ typedef enum {
2626
} pn_kind_t;
2727

2828
#define EMIT(fun, arg...) (comp->emit_method_table->fun(comp->emit, ##arg))
29-
#define EMIT_COMMON(fun, arg...) (emit_common_##fun(comp->pass, comp->scope_cur, comp->emit, comp->emit_method_table, ##arg))
3029

3130
typedef struct _compiler_t {
3231
qstr qstr___class__;
@@ -504,10 +503,10 @@ void c_assign(compiler_t *comp, py_parse_node_t pn, assign_kind_t assign_kind) {
504503
switch (assign_kind) {
505504
case ASSIGN_STORE:
506505
case ASSIGN_AUG_STORE:
507-
EMIT_COMMON(store_id, arg);
506+
EMIT(store_id, arg);
508507
break;
509508
case ASSIGN_AUG_LOAD:
510-
EMIT_COMMON(load_id, comp->qstr___class__, arg);
509+
EMIT(load_id, arg);
511510
break;
512511
}
513512
} else {
@@ -779,18 +778,18 @@ void compile_decorated(compiler_t *comp, py_parse_node_struct_t *pns) {
779778
}
780779

781780
// store func/class object into name
782-
EMIT_COMMON(store_id, body_name);
781+
EMIT(store_id, body_name);
783782
}
784783

785784
void compile_funcdef(compiler_t *comp, py_parse_node_struct_t *pns) {
786785
qstr fname = compile_funcdef_helper(comp, pns);
787786
// store function object into function name
788-
EMIT_COMMON(store_id, fname);
787+
EMIT(store_id, fname);
789788
}
790789

791790
void c_del_stmt(compiler_t *comp, py_parse_node_t pn) {
792791
if (PY_PARSE_NODE_IS_ID(pn)) {
793-
EMIT_COMMON(delete_id, PY_PARSE_NODE_LEAF_ARG(pn));
792+
EMIT(delete_id, PY_PARSE_NODE_LEAF_ARG(pn));
794793
} else if (PY_PARSE_NODE_IS_STRUCT_KIND(pn, PN_power)) {
795794
py_parse_node_struct_t *pns = (py_parse_node_struct_t*)pn;
796795

@@ -995,7 +994,7 @@ void compile_dotted_as_name(compiler_t *comp, py_parse_node_t pn) {
995994
EMIT(load_const_tok, PY_TOKEN_KW_NONE);
996995
qstr q1, q2;
997996
do_import_name(comp, pn, &q1, &q2);
998-
EMIT_COMMON(store_id, q1);
997+
EMIT(store_id, q1);
999998
}
1000999

10011000
void compile_import_name(compiler_t *comp, py_parse_node_struct_t *pns) {
@@ -1042,9 +1041,9 @@ void compile_import_from(compiler_t *comp, py_parse_node_struct_t *pns) {
10421041
qstr id2 = PY_PARSE_NODE_LEAF_ARG(pns3->nodes[0]); // should be id
10431042
EMIT(import_from, id2);
10441043
if (PY_PARSE_NODE_IS_NULL(pns3->nodes[1])) {
1045-
EMIT_COMMON(store_id, id2);
1044+
EMIT(store_id, id2);
10461045
} else {
1047-
EMIT_COMMON(store_id, PY_PARSE_NODE_LEAF_ARG(pns3->nodes[1]));
1046+
EMIT(store_id, PY_PARSE_NODE_LEAF_ARG(pns3->nodes[1]));
10481047
}
10491048
}
10501049
EMIT(pop_top);
@@ -1082,7 +1081,7 @@ void compile_nonlocal_stmt(compiler_t *comp, py_parse_node_struct_t *pns) {
10821081
void compile_assert_stmt(compiler_t *comp, py_parse_node_struct_t *pns) {
10831082
int l_end = comp_next_label(comp);
10841083
c_if_cond(comp, pns->nodes[0], true, l_end);
1085-
EMIT_COMMON(load_id, comp->qstr___class__, comp->qstr_assertion_error);
1084+
EMIT(load_id, comp->qstr_assertion_error);
10861085
if (!PY_PARSE_NODE_IS_NULL(pns->nodes[1])) {
10871086
// assertion message
10881087
compile_node(comp, pns->nodes[1]);
@@ -1276,7 +1275,7 @@ void compile_try_except(compiler_t *comp, py_parse_node_t pn_body, int n_except,
12761275
if (qstr_exception_local == 0) {
12771276
EMIT(pop_top);
12781277
} else {
1279-
EMIT_COMMON(store_id, qstr_exception_local);
1278+
EMIT(store_id, qstr_exception_local);
12801279
}
12811280

12821281
EMIT(pop_top);
@@ -1295,8 +1294,8 @@ void compile_try_except(compiler_t *comp, py_parse_node_t pn_body, int n_except,
12951294
EMIT(load_const_tok, PY_TOKEN_KW_NONE);
12961295
EMIT(label_assign, l3);
12971296
EMIT(load_const_tok, PY_TOKEN_KW_NONE);
1298-
EMIT_COMMON(store_id, qstr_exception_local);
1299-
EMIT_COMMON(delete_id, qstr_exception_local);
1297+
EMIT(store_id, qstr_exception_local);
1298+
EMIT(delete_id, qstr_exception_local);
13001299
EMIT(end_finally);
13011300
}
13021301
EMIT(jump, l2);
@@ -2051,7 +2050,7 @@ void compile_dictorsetmaker_item(compiler_t *comp, py_parse_node_struct_t *pns)
20512050
void compile_classdef(compiler_t *comp, py_parse_node_struct_t *pns) {
20522051
qstr cname = compile_classdef_helper(comp, pns);
20532052
// store class object into class name
2054-
EMIT_COMMON(store_id, cname);
2053+
EMIT(store_id, cname);
20552054
}
20562055

20572056
void compile_arglist_star(compiler_t *comp, py_parse_node_struct_t *pns) {
@@ -2129,7 +2128,7 @@ void compile_node(compiler_t *comp, py_parse_node_t pn) {
21292128
} else if (PY_PARSE_NODE_IS_LEAF(pn)) {
21302129
int arg = PY_PARSE_NODE_LEAF_ARG(pn);
21312130
switch (PY_PARSE_NODE_LEAF_KIND(pn)) {
2132-
case PY_PARSE_NODE_ID: EMIT_COMMON(load_id, comp->qstr___class__, arg); break;
2131+
case PY_PARSE_NODE_ID: EMIT(load_id, arg); break;
21332132
case PY_PARSE_NODE_SMALL_INT: EMIT(load_const_small_int, arg); break;
21342133
case PY_PARSE_NODE_INTEGER: EMIT(load_const_int, arg); break;
21352134
case PY_PARSE_NODE_DECIMAL: EMIT(load_const_dec, arg); break;
@@ -2300,7 +2299,7 @@ void check_for_doc_string(compiler_t *comp, py_parse_node_t pn) {
23002299
if (kind == PY_PARSE_NODE_STRING) {
23012300
compile_node(comp, pns->nodes[0]); // a doc string
23022301
// store doc string
2303-
EMIT_COMMON(store_id, comp->qstr___doc__);
2302+
EMIT(store_id, comp->qstr___doc__);
23042303
}
23052304
}
23062305
}
@@ -2387,7 +2386,7 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
23872386

23882387
int l_end = comp_next_label(comp);
23892388
int l_top = comp_next_label(comp);
2390-
EMIT_COMMON(load_id, comp->qstr___class__, qstr_arg);
2389+
EMIT(load_id, qstr_arg);
23912390
EMIT(label_assign, l_top);
23922391
EMIT(for_iter, l_end);
23932392
c_assign(comp, pns_comp_for->nodes[0], ASSIGN_STORE);
@@ -2418,12 +2417,12 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
24182417
scope->num_params = 1; // __locals__ is the parameter
24192418
}
24202419

2421-
EMIT_COMMON(load_id, comp->qstr___class__, comp->qstr___locals__);
2420+
EMIT(load_id, comp->qstr___locals__);
24222421
EMIT(store_locals);
2423-
EMIT_COMMON(load_id, comp->qstr___class__, comp->qstr___name__);
2424-
EMIT_COMMON(store_id, comp->qstr___module__);
2422+
EMIT(load_id, comp->qstr___name__);
2423+
EMIT(store_id, comp->qstr___module__);
24252424
EMIT(load_const_id, PY_PARSE_NODE_LEAF_ARG(pns->nodes[0])); // 0 is class name
2426-
EMIT_COMMON(store_id, comp->qstr___qualname__);
2425+
EMIT(store_id, comp->qstr___qualname__);
24272426

24282427
check_for_doc_string(comp, pns->nodes[2]);
24292428
compile_node(comp, pns->nodes[2]); // 2 is class body
@@ -2509,7 +2508,7 @@ void py_compile(py_parse_node_t pn) {
25092508
comp->scope_head = NULL;
25102509
comp->scope_cur = NULL;
25112510

2512-
emit_pass1_new(&comp->emit, &comp->emit_method_table);
2511+
emit_pass1_new(&comp->emit, &comp->emit_method_table, comp->qstr___class__);
25132512

25142513
pn = fold_constants(pn);
25152514
scope_new_and_link(comp, SCOPE_MODULE, pn);
@@ -2522,9 +2521,9 @@ void py_compile(py_parse_node_t pn) {
25222521
compile_scope_compute_things(comp, s);
25232522
}
25242523

2525-
//emit_cpython_new(&comp->emit, &comp->emit_method_table, comp->max_num_labels);
2524+
emit_cpython_new(&comp->emit, &comp->emit_method_table, comp->max_num_labels);
25262525
//emit_bc_new(&comp->emit, &comp->emit_method_table, comp->max_num_labels);
2527-
emit_x64_new(&comp->emit, &comp->emit_method_table, comp->max_num_labels);
2526+
//emit_x64_new(&comp->emit, &comp->emit_method_table, comp->max_num_labels);
25282527

25292528
for (scope_t *s = comp->scope_head; s != NULL; s = s->next) {
25302529
compile_scope(comp, s, PASS_2);

py/emit.h

Lines changed: 8 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ typedef struct _emit_method_table_t {
2424
int (*get_stack_size)(emit_t *emit);
2525
void (*set_stack_size)(emit_t *emit, int size);
2626

27+
void (*load_id)(emit_t *emit, qstr qstr);
28+
void (*store_id)(emit_t *emit, qstr qstr);
29+
void (*delete_id)(emit_t *emit, qstr qstr);
30+
2731
void (*label_assign)(emit_t *emit, int l);
2832
void (*import_name)(emit_t *emit, qstr qstr);
2933
void (*import_from)(emit_t *emit, qstr qstr);
@@ -108,107 +112,12 @@ typedef struct _emit_method_table_t {
108112
void (*yield_from)(emit_t *emit);
109113
} emit_method_table_t;
110114

111-
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);
112-
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);
113-
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);
114-
115-
void emit_pass1_new(emit_t **emit, const emit_method_table_t **emit_method_table);
116-
uint emit_pass1_get_max_num_labels(emit_t *emit);
115+
void emit_common_load_id(emit_t *emit, const emit_method_table_t *emit_method_table, scope_t *scope, qstr qstr);
116+
void emit_common_store_id(emit_t *emit, const emit_method_table_t *emit_method_table, scope_t *scope, qstr qstr);
117+
void emit_common_delete_id(emit_t *emit, const emit_method_table_t *emit_method_table, scope_t *scope, qstr qstr);
117118

119+
void emit_pass1_new(emit_t **emit, const emit_method_table_t **emit_method_table, qstr qstr___class__);
118120
void emit_cpython_new(emit_t **emit_out, const emit_method_table_t **emit_method_table_out, uint max_num_labels);
119121
void emit_bc_new(emit_t **emit, const emit_method_table_t **emit_method_table, uint max_num_labels);
120122
void emit_x64_new(emit_t **emit, const emit_method_table_t **emit_method_table, uint max_num_labels);
121123
void emit_thumb_new(emit_t **emit, const emit_method_table_t **emit_method_table, uint max_num_labels);
122-
123-
/*
124-
void emit_set_native_types(emitter_t *emit, bool do_native_types);
125-
void emit_start_pass(emitter_t *emit, pass_kind_t pass, scope_t *scope);
126-
void emit_end_pass(emitter_t *emit);
127-
bool emit_last_emit_was_return_value(emitter_t *emit);
128-
int emit_get_stack_size(emitter_t *emit);
129-
void emit_set_stack_size(emitter_t *emit, int size);
130-
131-
int emit_label_new(emitter_t *emit);
132-
void emit_label_assign(emitter_t *emit, int l);
133-
void emit_import_name(emitter_t *emit, qstr qstr);
134-
void emit_import_from(emitter_t *emit, qstr qstr);
135-
void emit_import_star(emitter_t *emit);
136-
void emit_load_const_tok(emitter_t *emit, py_token_kind_t tok);
137-
void emit_load_const_small_int(emitter_t *emit, int arg);
138-
void emit_load_const_int(emitter_t *emit, qstr qstr);
139-
void emit_load_const_dec(emitter_t *emit, qstr qstr);
140-
void emit_load_const_id(emitter_t *emit, qstr qstr);
141-
void emit_load_const_str(emitter_t *emit, qstr qstr, bool bytes);
142-
void emit_load_const_verbatim_start(emitter_t *emit);
143-
void emit_load_const_verbatim_int(emitter_t *emit, int val);
144-
void emit_load_const_verbatim_str(emitter_t *emit, const char *str);
145-
void emit_load_const_verbatim_strn(emitter_t *emit, const char *str, int len);
146-
void emit_load_const_verbatim_quoted_str(emitter_t *emit, qstr qstr, bool bytes);
147-
void emit_load_const_verbatim_end(emitter_t *emit);
148-
void emit_load_fast(emitter_t *emit, qstr qstr, int local_num);
149-
void emit_load_name(emitter_t *emit, qstr qstr);
150-
void emit_load_global(emitter_t *emit, qstr qstr);
151-
void emit_load_deref(emitter_t *emit, qstr qstr);
152-
void emit_load_closure(emitter_t *emit, qstr qstr);
153-
void emit_load_attr(emitter_t *emit, qstr qstr);
154-
void emit_load_method(emitter_t *emit, qstr qstr);
155-
void emit_load_build_class(emitter_t *emit);
156-
void emit_store_fast(emitter_t *emit, qstr qstr, int local_num);
157-
void emit_store_name(emitter_t *emit, qstr qstr);
158-
void emit_store_global(emitter_t *emit, qstr qstr);
159-
void emit_store_deref(emitter_t *emit, qstr qstr);
160-
void emit_store_attr(emitter_t *emit, qstr qstr);
161-
void emit_store_locals(emitter_t *emit);
162-
void emit_store_subscr(emitter_t *emit);
163-
void emit_delete_fast(emitter_t *emit, qstr qstr, int local_num);
164-
void emit_delete_name(emitter_t *emit, qstr qstr);
165-
void emit_delete_global(emitter_t *emit, qstr qstr);
166-
void emit_delete_deref(emitter_t *emit, qstr qstr);
167-
void emit_delete_attr(emitter_t *emit, qstr qstr);
168-
void emit_delete_subscr(emitter_t *emit);
169-
void emit_dup_top(emitter_t *emit);
170-
void emit_dup_top_two(emitter_t *emit);
171-
void emit_pop_top(emitter_t *emit);
172-
void emit_rot_two(emitter_t *emit);
173-
void emit_rot_three(emitter_t *emit);
174-
void emit_jump(emitter_t *emit, int label);
175-
void emit_pop_jump_if_true(emitter_t *emit, int label);
176-
void emit_pop_jump_if_false(emitter_t *emit, int label);
177-
void emit_jump_if_true_or_pop(emitter_t *emit, int label);
178-
void emit_jump_if_false_or_pop(emitter_t *emit, int label);
179-
void emit_setup_loop(emitter_t *emit, int label);
180-
void emit_break_loop(emitter_t *emit, int label);
181-
void emit_continue_loop(emitter_t *emit, int label);
182-
void emit_setup_with(emitter_t *emit, int label);
183-
void emit_with_cleanup(emitter_t *emit);
184-
void emit_setup_except(emitter_t *emit, int label);
185-
void emit_setup_finally(emitter_t *emit, int label);
186-
void emit_end_finally(emitter_t *emit);
187-
void emit_get_iter(emitter_t *emit); // tos = getiter(tos)
188-
void emit_for_iter(emitter_t *emit, int label);
189-
void emit_for_iter_end(emitter_t *emit);
190-
void emit_pop_block(emitter_t *emit);
191-
void emit_pop_except(emitter_t *emit);
192-
void emit_unary_op(emitter_t *emit, rt_unary_op_t op);
193-
void emit_binary_op(emitter_t *emit, rt_binary_op_t op);
194-
void emit_compare_op(emitter_t *emit, rt_compare_op_t op);
195-
void emit_build_tuple(emitter_t *emit, int n_args);
196-
void emit_build_list(emitter_t *emit, int n_args);
197-
void emit_list_append(emitter_t *emit, int list_stack_index);
198-
void emit_build_map(emitter_t *emit, int n_args);
199-
void emit_store_map(emitter_t *emit);
200-
void emit_map_add(emitter_t *emit, int map_stack_index);
201-
void emit_build_set(emitter_t *emit, int n_args);
202-
void emit_set_add(emitter_t *emit, int set_stack_index);
203-
void emit_build_slice(emitter_t *emit, int n_args);
204-
void emit_unpack_sequence(emitter_t *emit, int n_args);
205-
void emit_unpack_ex(emitter_t *emit, int n_left, int n_right);
206-
void emit_make_function(emitter_t *emit, scope_t *scope, int n_dict_params, int n_default_params);
207-
void emit_make_closure(emitter_t *emit, scope_t *scope, int n_dict_params, int n_default_params);
208-
void emit_call_function(emitter_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg);
209-
void emit_call_method(emitter_t *emit, int n_positional, int n_keyword, bool have_star_arg, bool have_dbl_star_arg);
210-
void emit_return_value(emitter_t *emit);
211-
void emit_raise_varargs(emitter_t *emit, int n_args);
212-
void emit_yield_value(emitter_t *emit);
213-
void emit_yield_from(emitter_t *emit);
214-
*/

py/emitbc.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ struct _emit_t {
3232
byte dummy_data[8];
3333
};
3434

35+
// forward declaration
36+
static const emit_method_table_t emit_bc_method_table;
37+
3538
uint emit_bc_get_code_size(emit_t* emit) {
3639
return emit->code_size;
3740
}
@@ -150,6 +153,18 @@ static void emit_bc_set_stack_size(emit_t *emit, int size) {
150153
emit->stack_size = size;
151154
}
152155

156+
static void emit_bc_load_id(emit_t *emit, qstr qstr) {
157+
emit_common_load_id(emit, &emit_bc_method_table, emit->scope, qstr);
158+
}
159+
160+
static void emit_bc_store_id(emit_t *emit, qstr qstr) {
161+
emit_common_store_id(emit, &emit_bc_method_table, emit->scope, qstr);
162+
}
163+
164+
static void emit_bc_delete_id(emit_t *emit, qstr qstr) {
165+
emit_common_delete_id(emit, &emit_bc_method_table, emit->scope, qstr);
166+
}
167+
153168
static void emit_pre(emit_t *emit, int stack_size_delta) {
154169
emit->stack_size += stack_size_delta;
155170
if (emit->stack_size > emit->scope->stack_size) {
@@ -665,6 +680,10 @@ static const emit_method_table_t emit_bc_method_table = {
665680
emit_bc_get_stack_size,
666681
emit_bc_set_stack_size,
667682

683+
emit_bc_load_id,
684+
emit_bc_store_id,
685+
emit_bc_delete_id,
686+
668687
emit_bc_label_assign,
669688
emit_bc_import_name,
670689
emit_bc_import_from,

0 commit comments

Comments
 (0)