diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-20 16:24:18 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-20 16:24:18 +0100 |
commit | 503faf9d5331b70d93836d221ff12f97d769499b (patch) | |
tree | eafea86b6bfc5b2b61a434ff0cf8e88bc31abe2e /miscutils/bc.c | |
parent | eaa3b00002e23e2ecccade3e06790dd524e7b662 (diff) | |
download | busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.tar.gz busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.tar.bz2 busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.zip |
bc: shrink "dc only" code by dropping unused structure members
function old new delta
zbc_program_num 979 981 +2
zbc_program_pushArray 147 145 -2
bc_program_pushVar 198 196 -2
bc_program_func 17 15 -2
dc_num_printChar 24 21 -3
bc_program_retire 35 32 -3
bc_program_binOpRetire 46 43 -3
zdc_program_printStream 153 148 -5
zbc_program_prep 91 86 -5
zbc_program_copyToVar 300 295 -5
zdc_program_modexp 721 715 -6
zbc_program_binOpPrep 311 305 -6
bc_program_addFunc 138 132 -6
bc_num_printNewline 51 45 -6
bc_num_printHex 67 61 -6
bc_num_printDigits 137 131 -6
zdc_program_assignStr 146 137 -9
bc_program_reset 64 55 -9
bc_func_free 27 5 -22
bc_parse_free 38 8 -30
bc_parse_create 92 47 -45
bc_func_init 50 5 -45
dc_main 691 645 -46
zdc_program_execStr 496 442 -54
zbc_program_print 677 623 -54
zbc_vm_process 204 137 -67
zbc_program_exec 4132 4057 -75
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/26 up/down: 2/-522) Total: -520 bytes
text data bss dec hex filename
969767 485 7296 977548 eea8c busybox_old
969210 485 7296 976991 ee85f busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to '')
-rw-r--r-- | miscutils/bc.c | 87 |
1 files changed, 46 insertions, 41 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index c59d5a2b5..c5288102d 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -348,9 +348,9 @@ typedef struct BcId { | |||
348 | 348 | ||
349 | typedef struct BcFunc { | 349 | typedef struct BcFunc { |
350 | BcVec code; | 350 | BcVec code; |
351 | BcVec labels; | 351 | IF_BC(BcVec labels;) |
352 | size_t nparams; | 352 | IF_BC(BcVec autos;) |
353 | BcVec autos; | 353 | IF_BC(size_t nparams;) |
354 | } BcFunc; | 354 | } BcFunc; |
355 | 355 | ||
356 | typedef enum BcResultType { | 356 | typedef enum BcResultType { |
@@ -385,7 +385,7 @@ typedef struct BcResult { | |||
385 | typedef struct BcInstPtr { | 385 | typedef struct BcInstPtr { |
386 | size_t func; | 386 | size_t func; |
387 | size_t idx; | 387 | size_t idx; |
388 | size_t len; | 388 | IF_BC(size_t len;) |
389 | } BcInstPtr; | 389 | } BcInstPtr; |
390 | 390 | ||
391 | // BC_LEX_NEG is not used in lexing; it is only for parsing. | 391 | // BC_LEX_NEG is not used in lexing; it is only for parsing. |
@@ -664,30 +664,29 @@ typedef struct BcLex { | |||
664 | typedef struct BcParse { | 664 | typedef struct BcParse { |
665 | BcLex l; | 665 | BcLex l; |
666 | 666 | ||
667 | BcVec exits; | 667 | IF_BC(BcVec exits;) |
668 | BcVec conds; | 668 | IF_BC(BcVec conds;) |
669 | 669 | IF_BC(BcVec ops;) | |
670 | BcVec ops; | ||
671 | 670 | ||
672 | BcFunc *func; | 671 | BcFunc *func; |
673 | size_t fidx; | 672 | size_t fidx; |
674 | 673 | ||
675 | size_t in_funcdef; | 674 | IF_BC(size_t in_funcdef;) |
676 | } BcParse; | 675 | } BcParse; |
677 | 676 | ||
678 | typedef struct BcProgram { | 677 | typedef struct BcProgram { |
679 | size_t len; | 678 | size_t len; |
680 | size_t scale; | 679 | size_t nchars; |
681 | 680 | ||
681 | size_t scale; | ||
682 | size_t ib_t; | 682 | size_t ib_t; |
683 | size_t ob_t; | 683 | size_t ob_t; |
684 | BcNum ob; | ||
685 | 684 | ||
686 | BcVec results; | 685 | BcVec results; |
687 | BcVec exestack; | 686 | BcVec exestack; |
688 | 687 | ||
689 | BcVec fns; | 688 | BcVec fns; |
690 | BcVec fn_map; | 689 | BcVec fn_map; //TODO: dc does not need this, its 'functions' are anonynomous (have no names) |
691 | 690 | ||
692 | BcVec vars; | 691 | BcVec vars; |
693 | BcVec var_map; | 692 | BcVec var_map; |
@@ -700,11 +699,9 @@ typedef struct BcProgram { | |||
700 | 699 | ||
701 | const char *file; | 700 | const char *file; |
702 | 701 | ||
703 | BcNum last; | ||
704 | BcNum zero; | 702 | BcNum zero; |
705 | BcNum one; | 703 | IF_BC(BcNum one;) |
706 | 704 | IF_BC(BcNum last;) | |
707 | size_t nchars; | ||
708 | } BcProgram; | 705 | } BcProgram; |
709 | 706 | ||
710 | #define BC_PROG_MAIN (0) | 707 | #define BC_PROG_MAIN (0) |
@@ -1616,6 +1613,7 @@ static BC_STATUS zbc_num_shift(BcNum *n, size_t places) | |||
1616 | 1613 | ||
1617 | static BC_STATUS zbc_num_inv(BcNum *a, BcNum *b, size_t scale) | 1614 | static BC_STATUS zbc_num_inv(BcNum *a, BcNum *b, size_t scale) |
1618 | { | 1615 | { |
1616 | //TODO: nice example of non-allocated BcNum, use in other places as well! | ||
1619 | BcNum one; | 1617 | BcNum one; |
1620 | BcDig num[2]; | 1618 | BcDig num[2]; |
1621 | 1619 | ||
@@ -2527,17 +2525,17 @@ static BC_STATUS zbc_func_insert(BcFunc *f, char *name, bool var) | |||
2527 | static void bc_func_init(BcFunc *f) | 2525 | static void bc_func_init(BcFunc *f) |
2528 | { | 2526 | { |
2529 | bc_char_vec_init(&f->code); | 2527 | bc_char_vec_init(&f->code); |
2530 | bc_vec_init(&f->autos, sizeof(BcId), bc_id_free); | 2528 | IF_BC(bc_vec_init(&f->labels, sizeof(size_t), NULL);) |
2531 | bc_vec_init(&f->labels, sizeof(size_t), NULL); | 2529 | IF_BC(bc_vec_init(&f->autos, sizeof(BcId), bc_id_free);) |
2532 | f->nparams = 0; | 2530 | IF_BC(f->nparams = 0;) |
2533 | } | 2531 | } |
2534 | 2532 | ||
2535 | static FAST_FUNC void bc_func_free(void *func) | 2533 | static FAST_FUNC void bc_func_free(void *func) |
2536 | { | 2534 | { |
2537 | BcFunc *f = (BcFunc *) func; | 2535 | BcFunc *f = (BcFunc *) func; |
2538 | bc_vec_free(&f->code); | 2536 | bc_vec_free(&f->code); |
2539 | bc_vec_free(&f->autos); | 2537 | IF_BC(bc_vec_free(&f->labels);) |
2540 | bc_vec_free(&f->labels); | 2538 | IF_BC(bc_vec_free(&f->autos);) |
2541 | } | 2539 | } |
2542 | 2540 | ||
2543 | static void bc_array_expand(BcVec *a, size_t len); | 2541 | static void bc_array_expand(BcVec *a, size_t len); |
@@ -3566,10 +3564,10 @@ static void bc_program_reset(void) | |||
3566 | static void bc_parse_reset(BcParse *p) | 3564 | static void bc_parse_reset(BcParse *p) |
3567 | { | 3565 | { |
3568 | if (p->fidx != BC_PROG_MAIN) { | 3566 | if (p->fidx != BC_PROG_MAIN) { |
3569 | p->func->nparams = 0; | ||
3570 | bc_vec_pop_all(&p->func->code); | 3567 | bc_vec_pop_all(&p->func->code); |
3571 | bc_vec_pop_all(&p->func->autos); | 3568 | IF_BC(bc_vec_pop_all(&p->func->labels);) |
3572 | bc_vec_pop_all(&p->func->labels); | 3569 | IF_BC(bc_vec_pop_all(&p->func->autos);) |
3570 | IF_BC(p->func->nparams = 0;) | ||
3573 | 3571 | ||
3574 | p->fidx = BC_PROG_MAIN; | 3572 | p->fidx = BC_PROG_MAIN; |
3575 | p->func = bc_program_func_BC_PROG_MAIN(); | 3573 | p->func = bc_program_func_BC_PROG_MAIN(); |
@@ -3578,18 +3576,18 @@ static void bc_parse_reset(BcParse *p) | |||
3578 | p->l.i = p->l.len; | 3576 | p->l.i = p->l.len; |
3579 | p->l.t.t = BC_LEX_EOF; | 3577 | p->l.t.t = BC_LEX_EOF; |
3580 | 3578 | ||
3581 | bc_vec_pop_all(&p->exits); | 3579 | IF_BC(bc_vec_pop_all(&p->exits);) |
3582 | bc_vec_pop_all(&p->conds); | 3580 | IF_BC(bc_vec_pop_all(&p->conds);) |
3583 | bc_vec_pop_all(&p->ops); | 3581 | IF_BC(bc_vec_pop_all(&p->ops);) |
3584 | 3582 | ||
3585 | bc_program_reset(); | 3583 | bc_program_reset(); |
3586 | } | 3584 | } |
3587 | 3585 | ||
3588 | static void bc_parse_free(BcParse *p) | 3586 | static void bc_parse_free(BcParse *p) |
3589 | { | 3587 | { |
3590 | bc_vec_free(&p->exits); | 3588 | IF_BC(bc_vec_free(&p->exits);) |
3591 | bc_vec_free(&p->conds); | 3589 | IF_BC(bc_vec_free(&p->conds);) |
3592 | bc_vec_free(&p->ops); | 3590 | IF_BC(bc_vec_free(&p->ops);) |
3593 | bc_lex_free(&p->l); | 3591 | bc_lex_free(&p->l); |
3594 | } | 3592 | } |
3595 | 3593 | ||
@@ -3598,9 +3596,9 @@ static void bc_parse_create(BcParse *p, size_t fidx) | |||
3598 | memset(p, 0, sizeof(BcParse)); | 3596 | memset(p, 0, sizeof(BcParse)); |
3599 | 3597 | ||
3600 | bc_lex_init(&p->l); | 3598 | bc_lex_init(&p->l); |
3601 | bc_vec_init(&p->exits, sizeof(size_t), NULL); | 3599 | IF_BC(bc_vec_init(&p->exits, sizeof(size_t), NULL);) |
3602 | bc_vec_init(&p->conds, sizeof(size_t), NULL); | 3600 | IF_BC(bc_vec_init(&p->conds, sizeof(size_t), NULL);) |
3603 | bc_vec_init(&p->ops, sizeof(BcLexType), NULL); | 3601 | IF_BC(bc_vec_init(&p->ops, sizeof(BcLexType), NULL);) |
3604 | 3602 | ||
3605 | p->fidx = fidx; | 3603 | p->fidx = fidx; |
3606 | p->func = bc_program_func(fidx); | 3604 | p->func = bc_program_func(fidx); |
@@ -5036,12 +5034,17 @@ static BC_STATUS zbc_program_num(BcResult *r, BcNum **num, bool hex) | |||
5036 | *num = bc_vec_top(v); | 5034 | *num = bc_vec_top(v); |
5037 | break; | 5035 | break; |
5038 | } | 5036 | } |
5037 | #if ENABLE_BC | ||
5039 | case BC_RESULT_LAST: | 5038 | case BC_RESULT_LAST: |
5040 | *num = &G.prog.last; | 5039 | *num = &G.prog.last; |
5041 | break; | 5040 | break; |
5042 | case BC_RESULT_ONE: | 5041 | case BC_RESULT_ONE: |
5043 | *num = &G.prog.one; | 5042 | *num = &G.prog.one; |
5044 | break; | 5043 | break; |
5044 | #endif | ||
5045 | default: | ||
5046 | // Testing the theory that dc does not reach LAST/ONE | ||
5047 | bb_error_msg_and_die("BUG:%d", r->t); | ||
5045 | } | 5048 | } |
5046 | 5049 | ||
5047 | RETURN_STATUS(BC_STATUS_SUCCESS); | 5050 | RETURN_STATUS(BC_STATUS_SUCCESS); |
@@ -5178,7 +5181,7 @@ static BC_STATUS zbc_program_read(void) | |||
5178 | 5181 | ||
5179 | ip.func = BC_PROG_READ; | 5182 | ip.func = BC_PROG_READ; |
5180 | ip.idx = 0; | 5183 | ip.idx = 0; |
5181 | ip.len = G.prog.results.len; | 5184 | IF_BC(ip.len = G.prog.results.len;) |
5182 | 5185 | ||
5183 | // Update this pointer, just in case. | 5186 | // Update this pointer, just in case. |
5184 | f = bc_program_func(BC_PROG_READ); | 5187 | f = bc_program_func(BC_PROG_READ); |
@@ -5496,7 +5499,9 @@ static BC_STATUS zbc_program_print(char inst, size_t idx) | |||
5496 | 5499 | ||
5497 | if (BC_PROG_NUM(r, num)) { | 5500 | if (BC_PROG_NUM(r, num)) { |
5498 | s = zbc_num_print(num, !pop); | 5501 | s = zbc_num_print(num, !pop); |
5499 | if (!s) bc_num_copy(&G.prog.last, num); | 5502 | #if ENABLE_BC |
5503 | if (!s && IS_BC) bc_num_copy(&G.prog.last, num); | ||
5504 | #endif | ||
5500 | } else { | 5505 | } else { |
5501 | char *str; | 5506 | char *str; |
5502 | 5507 | ||
@@ -6322,7 +6327,7 @@ static BC_STATUS zdc_program_execStr(char *code, size_t *bgn, bool cond) | |||
6322 | } | 6327 | } |
6323 | 6328 | ||
6324 | ip.idx = 0; | 6329 | ip.idx = 0; |
6325 | ip.len = G.prog.results.len; | 6330 | IF_BC(ip.len = G.prog.results.len;) |
6326 | ip.func = fidx; | 6331 | ip.func = fidx; |
6327 | 6332 | ||
6328 | bc_vec_pop(&G.prog.results); | 6333 | bc_vec_pop(&G.prog.results); |
@@ -6977,7 +6982,7 @@ static void bc_program_free(void) | |||
6977 | bc_vec_free(&G.prog.exestack); | 6982 | bc_vec_free(&G.prog.exestack); |
6978 | bc_num_free(&G.prog.last); | 6983 | bc_num_free(&G.prog.last); |
6979 | bc_num_free(&G.prog.zero); | 6984 | bc_num_free(&G.prog.zero); |
6980 | bc_num_free(&G.prog.one); | 6985 | IF_BC(bc_num_free(&G.prog.one);) |
6981 | bc_vec_free(&G.input_buffer); | 6986 | bc_vec_free(&G.input_buffer); |
6982 | } | 6987 | } |
6983 | 6988 | ||
@@ -7001,14 +7006,14 @@ static void bc_program_init(void) | |||
7001 | G.prog.ib_t = 10; | 7006 | G.prog.ib_t = 10; |
7002 | G.prog.ob_t = 10; | 7007 | G.prog.ob_t = 10; |
7003 | 7008 | ||
7004 | bc_num_init_DEF_SIZE(&G.prog.last); | 7009 | IF_BC(bc_num_init_DEF_SIZE(&G.prog.last);) |
7005 | //bc_num_zero(&G.prog.last); - already is | 7010 | //IF_BC(bc_num_zero(&G.prog.last);) - already is |
7006 | 7011 | ||
7007 | bc_num_init_DEF_SIZE(&G.prog.zero); | 7012 | bc_num_init_DEF_SIZE(&G.prog.zero); |
7008 | //bc_num_zero(&G.prog.zero); - already is | 7013 | //bc_num_zero(&G.prog.zero); - already is |
7009 | 7014 | ||
7010 | bc_num_init_DEF_SIZE(&G.prog.one); | 7015 | IF_BC(bc_num_init_DEF_SIZE(&G.prog.one);) |
7011 | bc_num_one(&G.prog.one); | 7016 | IF_BC(bc_num_one(&G.prog.one);) |
7012 | 7017 | ||
7013 | bc_vec_init(&G.prog.fns, sizeof(BcFunc), bc_func_free); | 7018 | bc_vec_init(&G.prog.fns, sizeof(BcFunc), bc_func_free); |
7014 | bc_vec_init(&G.prog.fn_map, sizeof(BcId), bc_id_free); | 7019 | bc_vec_init(&G.prog.fn_map, sizeof(BcId), bc_id_free); |