bc: avoid successive bc_vec_item(&func->autos, i)
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 19 Dec 2018 16:55:23 +0000 (17:55 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 19 Dec 2018 16:55:23 +0000 (17:55 +0100)
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 <vda.linux@googlemail.com>
miscutils/bc.c

index 12e3079f19abf7febc6396b642e17cbf00f6a0a8..8316933f6c7347a121487c0c713b7d98f870f697 100644 (file)
@@ -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);
        }