summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2018-12-16 23:24:25 +0100
committerDenys Vlasenko2018-12-16 23:24:25 +0100
commit266aa000126dcbb9e1c93306165f433a167bb50a (patch)
tree493b3f1230dfbf0ea54d4abda4b8c20045ecd667
parent8e7686e4577ac7b07845d16fd95a39a4ce0af3c1 (diff)
downloadbusybox-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.c13
-rwxr-xr-xtestsuite/bc.tests17
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