From 87888ce4d826a117bac89fe3475a8ae859a6e42a Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 19 Dec 2018 17:55:23 +0100 Subject: bc: avoid successive bc_vec_item(&func->autos, i) function old new delta zbc_func_insert 97 100 +3 zbc_program_call 353 354 +1 zbc_program_exec 4085 4078 -7 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/1 up/down: 4/-7) Total: -3 bytes text data bss dec hex filename 981403 485 7296 989184 f1800 busybox_old 981400 485 7296 989181 f17fd busybox_unstripped Signed-off-by: Denys Vlasenko --- miscutils/bc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/miscutils/bc.c b/miscutils/bc.c index 12e3079f1..8316933f6 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -2504,11 +2504,13 @@ static BC_STATUS zbc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d) #if ENABLE_BC static BC_STATUS zbc_func_insert(BcFunc *f, char *name, bool var) { + BcId *autoid; BcId a; size_t i; - for (i = 0; i < f->autos.len; ++i) { - if (strcmp(name, ((BcId *) bc_vec_item(&f->autos, i))->name) == 0) + autoid = (void*)f->autos.v; + for (i = 0; i < f->autos.len; i++, autoid++) { + if (strcmp(name, autoid->name) == 0) RETURN_STATUS(bc_error("function parameter or auto var has the same name as another")); } @@ -5888,12 +5890,11 @@ static BC_STATUS zbc_program_call(char *code, size_t *idx) if (s) RETURN_STATUS(s); } - for (; i < func->autos.len; ++i) { + a = bc_vec_item(&func->autos, i); + for (; i < func->autos.len; i++, a++) { BcVec *v; - a = bc_vec_item(&func->autos, i); v = bc_program_search(a->name, a->idx); - if (a->idx) { BcNum n2; bc_num_init_DEF_SIZE(&n2); @@ -5915,6 +5916,7 @@ static BC_STATUS zbc_program_return(char inst) { BcResult res; BcFunc *f; + BcId *a; size_t i; BcInstPtr *ip = bc_vec_top(&G.prog.exestack); @@ -5939,10 +5941,9 @@ static BC_STATUS zbc_program_return(char inst) } // We need to pop arguments as well, so this takes that into account. - for (i = 0; i < f->autos.len; ++i) { + a = (void*)f->autos.v; + for (i = 0; i < f->autos.len; i++, a++) { BcVec *v; - BcId *a = bc_vec_item(&f->autos, i); - v = bc_program_search(a->name, a->idx); bc_vec_pop(v); } -- cgit v1.2.3