8000 py: Combine 3 comprehension emit functions (list/dict/set) into 1. · sparkfun/circuitpython@a5624bf · GitHub
[go: up one dir, main page]

Skip to content

Commit a5624bf

Browse files
committed
py: Combine 3 comprehension emit functions (list/dict/set) into 1.
The 3 kinds of comprehensions are similar enough that merging their emit functions reduces code size. Decreases in code size in bytes are: bare-arm:24, minimal:96, unix(NDEBUG,x86-64):328, stmhal:80, esp8266:76.
1 parent 4b3f1d7 commit a5624bf

File tree

4 files changed

+54
-70
lines changed

4 files changed

+54
-70
lines changed

py/compile.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2869,17 +2869,11 @@ STATIC void compile_scope_comp_iter(compiler_t *comp, mp_parse_node_struct_t *pn
28692869
if (MP_PARSE_NODE_IS_NULL(pn_iter)) {
28702870
// no more nested if/for; compile inner expression
28712871
compile_node(comp, pn_inner_expr);
2872-
if (comp->scope_cur->kind == SCOPE_LIST_COMP) {
2873-
EMIT_ARG(list_append, for_depth + 2);
2874-
} else if (comp->scope_cur->kind == SCOPE_DICT_COMP) {
2875-
EMIT_ARG(map_add, for_depth + 2);
2876-
#if MICROPY_PY_BUILTINS_SET
2877-
} else if (comp->scope_cur->kind == SCOPE_SET_COMP) {
2878-
EMIT_ARG(set_add, for_depth + 2);
2879-
#endif
2880-
} else {
2872+
if (comp->scope_cur->kind == SCOPE_GEN_EXPR) {
28812873
EMIT(yield_value);
28822874
EMIT(pop_top);
2875+
} else {
2876+
EMIT_ARG(store_comp, comp->scope_cur->kind, for_depth + 2);
28832877
}
28842878
} else if (MP_PARSE_NODE_IS_STRUCT_KIND(pn_iter, PN_comp_if)) {
28852879
// if condition

py/emit.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,17 +119,15 @@ typedef struct _emit_method_table_t {
119119
void (*binary_op)(emit_t *emit, mp_binary_op_t op);
120120
void (*build_tuple)(emit_t *emit, mp_uint_t n_args);
121121
void (*build_list)(emit_t *emit, mp_uint_t n_args);
122-
void (*list_append)(emit_t *emit, mp_uint_t list_stack_index);
123122
void (*build_map)(emit_t *emit, mp_uint_t n_args);
124123
void (*store_map)(emit_t *emit);
125-
void (*map_add)(emit_t *emit, mp_uint_t map_stack_index);
126124
#if MICROPY_PY_BUILTINS_SET
127125
void (*build_set)(emit_t *emit, mp_uint_t n_args);
128-
void (*set_add)(emit_t *emit, mp_uint_t set_stack_index);
129126
#endif
130127
#if MICROPY_PY_BUILTINS_SLICE
131128
void (*build_slice)(emit_t *emit, mp_uint_t n_args);
132129
#endif
130+
void (*store_comp)(emit_t *emit, scope_kind_t kind, mp_uint_t set_stack_index);
133131
void (*unpack_sequence)(emit_t *emit, mp_uint_t n_args);
134132
void (*unpack_ex)(emit_t *emit, mp_uint_t n_left, mp_uint_t n_right);
135133
void (*make_function)(emit_t *emit, scope_t *scope, mp_uint_t n_pos_defaults, mp_uint_t n_kw_defaults);
@@ -240,17 +238,15 @@ void mp_emit_bc_unary_op(emit_t *emit, mp_unary_op_t op);
240238
void mp_emit_bc_binary_op(emit_t *emit, mp_binary_op_t op);
241239
void mp_emit_bc_build_tuple(emit_t *emit, mp_uint_t n_args);
242240
void mp_emit_bc_build_list(emit_t *emit, mp_uint_t n_args);
243-
void mp_emit_bc_list_append(emit_t *emit, mp_uint_t list_stack_index);
244241
void mp_emit_bc_build_map(emit_t *emit, mp_uint_t n_args);
245242
void mp_emit_bc_store_map(emit_t *emit);
246-
void mp_emit_bc_map_add(emit_t *emit, mp_uint_t map_stack_index);
247243
#if MICROPY_PY_BUILTINS_SET
248244
void mp_emit_bc_build_set(emit_t *emit, mp_uint_t n_args);
249-
void mp_emit_bc_set_add(emit_t *emit, mp_uint_t set_stack_index);
250245
#endif
251246
#if MICROPY_PY_BUILTINS_SLICE
252247
void mp_emit_bc_build_slice(emit_t *emit, mp_uint_t n_args);
253248
#endif
249+
void mp_emit_bc_store_comp(emit_t *emit, scope_kind_t kind, mp_uint_t list_stack_index);
254250
void mp_emit_bc_unpack_sequence(emit_t *emit, mp_uint_t n_args);
255251
void mp_emit_bc_unpack_ex(emit_t *emit, mp_uint_t n_left, mp_uint_t n_right);
256252
void mp_emit_bc_make_function(emit_t *emit, scope_t *scope, mp_uint_t n_pos_defaults, mp_uint_t n_kw_defaults);

py/emitbc.c

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -837,11 +837,6 @@ void mp_emit_bc_build_list(emit_t *emit, mp_uint_t n_args) {
837837
emit_write_bytecode_byte_uint(emit, MP_BC_BUILD_LIST, n_args);
838838
}
839839

840-
void mp_emit_bc_list_append(emit_t *emit, mp_uint_t list_stack_index) {
841-
emit_bc_pre(emit, -1);
842-
emit_write_bytecode_byte_uint(emit, MP_BC_LIST_APPEND, list_stack_index);
843-
}
844-
845840
void mp_emit_bc_build_map(emit_t *emit, mp_uint_t n_args) {
846841
emit_bc_pre(emit, 1);
847842
emit_write_bytecode_byte_uint(emit, MP_BC_BUILD_MAP, n_args);
@@ -852,21 +847,11 @@ void mp_emit_bc_store_map(emit_t *emit) {
852847
emit_write_bytecode_byte(emit, MP_BC_STORE_MAP);
853848
}
854849

855-
void mp_emit_bc_map_add(emit_t *emit, mp_uint_t map_stack_index) {
856-
emit_bc_pre(emit, -2);
857-
emit_write_bytecode_byte_uint(emit, MP_BC_MAP_ADD, map_stack_index);
858-
}
859-
860850
#if MICROPY_PY_BUILTINS_SET
861851
void mp_emit_bc_build_set(emit_t *emit, mp_uint_t n_args) {
862852
emit_bc_pre(emit, 1 - n_args);
863853
emit_write_bytecode_byte_uint(emit, MP_BC_BUILD_SET, n_args);
864854
}
865-
866-
void mp_emit_bc_set_add(emit_t *emit, mp_uint_t set_stack_index) {
867-
emit_bc_pre(emit, -1);
868-
emit_write_bytecode_byte_uint(emit, MP_BC_SET_ADD, set_stack_index);
869-
}
870855
#endif
871856

872857
#if MICROPY_PY_BUILTINS_SLICE
@@ -876,6 +861,24 @@ void mp_emit_bc_build_slice(emit_t *emit, mp_uint_t n_args) {
876861
}
877862
#endif
878863

864+
void mp_emit_bc_store_comp(emit_t *emit, scope_kind_t kind, mp_uint_t collection_stack_index) {
865+
int n;
866+
byte opcode;
867+
if (kind == SCOPE_LIST_COMP) {
868+
n = -1;
869+
opcode = MP_BC_LIST_APPEND;
870+
} else if (MICROPY_PY_BUILTINS_SET && kind == SCOPE_SET_COMP) {
871+
n = -1;
872+
opcode = MP_BC_SET_ADD;
873+
} else {
874+
// scope == SCOPE_DICT_COMP
875+
n = -2;
876+
opcode = MP_BC_MAP_ADD;
877+
}
878+
emit_bc_pre(emit, n);
879+
emit_write_bytecode_byte_uint(emit, opcode, collection_stack_index);
880+
}
881+
879882
void mp_emit_bc_unpack_sequence(emit_t *emit, mp_uint_t n_args) {
880883
emit_bc_pre(emit, -1 + n_args);
881884
emit_write_bytecode_byte_uint(emit, MP_BC_UNPACK_SEQUENCE, n_args);
@@ -1028,17 +1031,15 @@ const emit_method_table_t emit_bc_method_table = {
10281031
mp_emit_bc_binary_op,
10291032
mp_emit_bc_build_tuple,
10301033
mp_emit_bc_build_list,
1031-
mp_emit_bc_list_append,
10321034
mp_emit_bc_build_map,
10331035
mp_emit_bc_store_map,
1034-
mp_emit_bc_map_add,
10351036
#if MICROPY_PY_BUILTINS_SET
10361037
mp_emit_bc_build_set,
1037-
mp_emit_bc_set_add,
10381038
#endif
10391039
#if MICROPY_PY_BUILTINS_SLICE
10401040
mp_emit_bc_build_slice,
10411041
#endif
1042+
mp_emit_bc_store_comp,
10421043
mp_emit_bc_unpack_sequence,
10431044
mp_emit_bc_unpack_ex,
10441045
mp_emit_bc_make_function,

py/emitnative.c

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2344,17 +2344,6 @@ STATIC void emit_native_build_list(emit_t *emit, mp_uint_t n_args) {
23442344
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); // new list
23452345
}
23462346

2347-
STATIC void emit_native_list_append(emit_t *emit, mp_uint_t list_index) {
2348-
// only used in list comprehension
2349-
vtype_kind_t vtype_list, vtype_item;
2350-
emit_pre_pop_reg(emit, &vtype_item, REG_ARG_2);
2351-
emit_access_stack(emit, list_index, &vtype_list, REG_ARG_1);
2352-
assert(vtype_list == VTYPE_PYOBJ);
2353-
assert(vtype_item == VTYPE_PYOBJ);
2354-
emit_call(emit, MP_F_LIST_APPEND);
2355-
emit_post(emit);
2356-
}
2357-
23582347
STATIC void emit_native_build_map(emit_t *emit, mp_uint_t n_args) {
23592348
emit_native_pre(emit);
23602349
emit_call_with_imm_arg(emit, MP_F_BUILD_MAP, n_args, REG_ARG_1);
@@ -2371,36 +2360,13 @@ STATIC void emit_native_store_map(emit_t *emit) {
23712360
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); // map
23722361
}
23732362

2374-
STATIC void emit_native_map_add(emit_t *emit, mp_uint_t map_index) {
2375-
// only used in list comprehension
2376-
vtype_kind_t vtype_map, vtype_key, vtype_value;
2377-
emit_pre_pop_reg_reg(emit, &vtype_key, REG_ARG_2, &vtype_value, REG_ARG_3);
2378-
emit_access_stack(emit, map_index, &vtype_map, REG_ARG_1);
2379-
assert(vtype_map == VTYPE_PYOBJ);
2380-
assert(vtype_key == VTYPE_PYOBJ);
2381-
assert(vtype_value == VTYPE_PYOBJ);
2382-
emit_call(emit, MP_F_STORE_MAP);
2383-
emit_post(emit);
2384-
}
2385-
23862363
#if MICROPY_PY_BUILTINS_SET
23872364
STATIC void emit_native_build_set(emit_t *emit, mp_uint_t n_args) {
23882365
emit_native_pre(emit);
23892366
emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_2, n_args); // pointer to items
23902367
emit_call_with_imm_arg(emit, MP_F_BUILD_SET, n_args, REG_ARG_1);
23912368
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); // new set
23922369
}
2393-
2394-
STATIC void emit_native_set_add(emit_t *emit, mp_uint_t set_index) {
2395-
// only used in set comprehension
2396-
vtype_kind_t vtype_set, vtype_item;
2397-
emit_pre_pop_reg(emit, &vtype_item, REG_ARG_2);
2398-
emit_access_stack(emit, set_index, &vtype_set, REG_ARG_1);
2399-
assert(vtype_set == VTYPE_PYOBJ);
2400-
assert(vtype_item == VTYPE_PYOBJ);
2401-
emit_call(emit, MP_F_STORE_SET);
2402-
emit_post(emit);
2403-
}
24042370
#endif
24052371

24062372
#if MICROPY_PY_BUILTINS_SLICE
@@ -2426,6 +2392,35 @@ STATIC void emit_native_build_slice(emit_t *emit, mp_uint_t n_args) {
24262392
}
24272393
#endif
24282394

2395+
STATIC void emit_native_store_comp(emit_t *emit, scope_kind_t kind, mp_uint_t collection_index) {
2396+
mp_fun_kind_t f;
2397+
if (kind == SCOPE_LIST_COMP) {
2398+
vtype_kind_t vtype_item;
2399+
emit_pre_pop_reg(emit, &vtype_item, REG_ARG_2);
2400+
assert(vtype_item == VTYPE_PYOBJ);
2401+
f = MP_F_LIST_APPEND;
2402+
#if MICROPY_PY_BUILTINS_SET
2403+
} else if (kind == SCOPE_SET_COMP) {
2404+
vtype_kind_t vtype_item;
2405+
emit_pre_pop_reg(emit, &vtype_item, REG_ARG_2);
2406+
assert(vtype_item == VTYPE_PYOBJ);
2407+
f = MP_F_STORE_SET;
2408+
#endif
2409+
} else {
2410+
// SCOPE_DICT_COMP
2411+
vtype_kind_t vtype_key, vtype_value;
2412+
emit_pre_pop_reg_reg(emit, &vtype_key, REG_ARG_2, &vtype_value, REG_ARG_3);
2413+
assert(vtype_key == VTYPE_PYOBJ);
2414+
assert(vtype_value == VTYPE_PYOBJ);
2415+
f = MP_F_STORE_MAP;
2416+
}
2417+
vtype_kind_t vtype_collection;
2418+
emit_access_stack(emit, collection_index, &vtype_collection, REG_ARG_1);
2419+
assert(vtype_collection == VTYPE_PYOBJ);
2420+
emit_call(emit, f);
2421+
emit_post(emit);
2422+
}
2423+
24292424
STATIC void emit_native_unpack_sequence(emit_t *emit, mp_uint_t n_args) {
24302425
DEBUG_printf("unpack_sequence %d\n", n_args);
24312426
vtype_kind_t vtype_base;
@@ -2674,17 +2669,15 @@ const emit_method_table_t EXPORT_FUN(method_table) = {
26742669
emit_native_binary_op,
26752670
emit_native_build_tuple,
26762671
emit_native_build_list,
2677-
emit_native_list_append,
26782672
emit_native_build_map,
26792673
emit_native_store_map,
2680-
emit_native_map_add,
26812674
#if MICROPY_PY_BUILTINS_SET
26822675
emit_native_build_set,
2683-
emit_native_set_add,
26842676
#endif
26852677
#if MICROPY_PY_BUILTINS_SLICE
26862678
emit_native_build_slice,
26872679
#endif
2680+
emit_native_store_comp,
26882681
emit_native_unpack_sequence,
26892682
emit_native_unpack_ex,
26902683
emit_native_make_function,

0 commit comments

Comments
 (0)
0