[git commit] bc: simplify zbc_parse_break_or_continue(), logic is the same

Denys Vlasenko vda.linux at googlemail.com
Sun Dec 16 18:47:40 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=563d93c9a4e2a784dfbec6703c572fb88eb99332
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2259    2224     -35
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-35)             Total: -35 bytes
   text	   data	    bss	    dec	    hex	filename
 982218	    485	   7296	 989999	  f1b2f	busybox_old
 982183	    485	   7296	 989964	  f1b0c	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 miscutils/bc.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/miscutils/bc.c b/miscutils/bc.c
index 9ce6ab667..8aaeeaf9f 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -4358,20 +4358,19 @@ static BC_STATUS zbc_parse_break_or_continue(BcParse *p, BcLexType type)
 {
 	BcStatus s;
 	size_t i;
-	BcInstPtr *ip;
 
 	if (type == BC_LEX_KEY_BREAK) {
-		if (p->exits.len == 0) RETURN_STATUS(bc_error_bad_token());
-
-		i = p->exits.len - 1;
-		ip = bc_vec_item(&p->exits, i);
-
-		while (!ip->func && i < p->exits.len)
-			ip = bc_vec_item(&p->exits, i--);
-		if (i >= p->exits.len && !ip->func)
-			RETURN_STATUS(bc_error_bad_token());
+		BcInstPtr *ipp;
 
-		i = ip->idx;
+		i = p->exits.len;
+		for (;;) {
+			if (i == 0) // none of the enclosing blocks is a loop
+				RETURN_STATUS(bc_error_bad_token());
+			ipp = bc_vec_item(&p->exits, --i);
+			if (ipp->func != 0)
+				break;
+		}
+		i = ipp->idx;
 	}
 	else
 		i = *((size_t *) bc_vec_top(&p->conds));


More information about the busybox-cvs mailing list