diff options
author | Denys Vlasenko | 2018-12-16 23:24:25 +0100 |
---|---|---|
committer | Denys Vlasenko | 2018-12-16 23:24:25 +0100 |
commit | 266aa000126dcbb9e1c93306165f433a167bb50a (patch) | |
tree | 493b3f1230dfbf0ea54d4abda4b8c20045ecd667 | |
parent | 8e7686e4577ac7b07845d16fd95a39a4ce0af3c1 (diff) | |
download | busybox-266aa000126dcbb9e1c93306165f433a167bb50a.zip busybox-266aa000126dcbb9e1c93306165f433a167bb50a.tar.gz |
bc: store only index in p->exits, it's the only thing used there
function old new delta
zbc_parse_stmt_possibly_auto 1967 1964 -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3) Total: -3 bytes
text data bss dec hex filename
981937 485 7296 989718 f1a16 busybox_old
981934 485 7296 989715 f1a13 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/bc.c | 13 | ||||
-rwxr-xr-x | testsuite/bc.tests | 17 |
2 files changed, 22 insertions, 8 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index ca14c1b..979d511 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -3642,7 +3642,7 @@ static void bc_parse_create(BcParse *p, size_t func) memset(p, 0, sizeof(BcParse)); bc_lex_init(&p->l); - bc_vec_init(&p->exits, sizeof(BcInstPtr), NULL); + bc_vec_init(&p->exits, sizeof(size_t), NULL); bc_vec_init(&p->conds, sizeof(size_t), NULL); bc_vec_init(&p->ops, sizeof(BcLexType), NULL); @@ -4192,7 +4192,7 @@ static BC_STATUS zbc_parse_while(BcParse *p) ip.func = 1; ip.len = 0; - bc_vec_push(&p->exits, &ip); + bc_vec_push(&p->exits, &ip.idx); bc_vec_push(&p->func->labels, &ip.idx); s = zbc_parse_expr(p, BC_PARSE_REL, bc_parse_next_rel); @@ -4294,7 +4294,7 @@ static BC_STATUS zbc_parse_for(BcParse *p) ip.func = 1; ip.len = 0; - bc_vec_push(&p->exits, &ip); + bc_vec_push(&p->exits, &ip.idx); bc_vec_push(&p->func->labels, &ip.idx); // for(...)<newline>stmt is accepted as well @@ -4328,14 +4328,11 @@ static BC_STATUS zbc_parse_break_or_continue(BcParse *p, BcLexType type) size_t i; if (type == BC_LEX_KEY_BREAK) { - BcInstPtr *ipp; - if (p->exits.len == 0) // none of the enclosing blocks is a loop RETURN_STATUS(bc_error_bad_token()); - ipp = bc_vec_top(&p->exits); - i = ipp->idx; + i = *(size_t*)bc_vec_top(&p->exits); } else { - i = *((size_t *) bc_vec_top(&p->conds)); + i = *(size_t*)bc_vec_top(&p->conds); } bc_parse_push(p, BC_INST_JUMP); diff --git a/testsuite/bc.tests b/testsuite/bc.tests index 0690e9c..d057bea 100755 --- a/testsuite/bc.tests +++ b/testsuite/bc.tests @@ -134,6 +134,23 @@ while(i--) { 99 " +testing "bc continue in for" \ + "bc" \ + "\ +1 +77 +2 +99 +" \ + "" "\ +for(i=1; i<3; i++) { + i + if(i==2) continue + 77 +} +99 +" + tar xJf bc_large.tar.xz for f in bc*.bc; do |