aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-15 15:07:14 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-15 15:07:14 +0100
commitfd51e0c4d22825282f3e38be0655db36b3e716d2 (patch)
tree7137b1c7c1a84d20ae1a9231fea052b6e17e31d8
parent7db384338a803fc74a0e8eb62e9369e10a49ffdb (diff)
downloadbusybox-w32-fd51e0c4d22825282f3e38be0655db36b3e716d2.tar.gz
busybox-w32-fd51e0c4d22825282f3e38be0655db36b3e716d2.tar.bz2
busybox-w32-fd51e0c4d22825282f3e38be0655db36b3e716d2.zip
bc: simplify BC_INST_JUMP[_ZERO] handling
function old new delta zbc_program_exec 4063 4050 -13 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/bc.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 2feaf7bf3..aeb29a971 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -6715,7 +6715,6 @@ static BC_STATUS zbc_program_exec(void)
6715 BcInstPtr *ip = bc_vec_top(&G.prog.stack); 6715 BcInstPtr *ip = bc_vec_top(&G.prog.stack);
6716 BcFunc *func = bc_program_func(ip->func); 6716 BcFunc *func = bc_program_func(ip->func);
6717 char *code = func->code.v; 6717 char *code = func->code.v;
6718 bool cond = false;
6719 6718
6720 while (ip->idx < func->code.len) { 6719 while (ip->idx < func->code.len) {
6721 BcStatus s = BC_STATUS_SUCCESS; 6720 BcStatus s = BC_STATUS_SUCCESS;
@@ -6723,17 +6722,22 @@ static BC_STATUS zbc_program_exec(void)
6723 6722
6724 switch (inst) { 6723 switch (inst) {
6725#if ENABLE_BC 6724#if ENABLE_BC
6726 case BC_INST_JUMP_ZERO: 6725 case BC_INST_JUMP_ZERO: {
6726 bool zero;
6727 s = zbc_program_prep(&ptr, &num); 6727 s = zbc_program_prep(&ptr, &num);
6728 if (s) RETURN_STATUS(s); 6728 if (s) RETURN_STATUS(s);
6729 cond = !bc_num_cmp(num, &G.prog.zero); 6729 zero = (bc_num_cmp(num, &G.prog.zero) == 0);
6730 bc_vec_pop(&G.prog.results); 6730 bc_vec_pop(&G.prog.results);
6731 // Fallthrough. 6731 if (!zero) {
6732 bc_program_index(code, &ip->idx);
6733 break;
6734 }
6735 // else: fall through
6736 }
6732 case BC_INST_JUMP: { 6737 case BC_INST_JUMP: {
6733 size_t *addr;
6734 size_t idx = bc_program_index(code, &ip->idx); 6738 size_t idx = bc_program_index(code, &ip->idx);
6735 addr = bc_vec_item(&func->labels, idx); 6739 size_t *addr = bc_vec_item(&func->labels, idx);
6736 if (inst == BC_INST_JUMP || cond) ip->idx = *addr; 6740 ip->idx = *addr;
6737 break; 6741 break;
6738 } 6742 }
6739 case BC_INST_CALL: 6743 case BC_INST_CALL:
@@ -6851,8 +6855,7 @@ static BC_STATUS zbc_program_exec(void)
6851 break; 6855 break;
6852 case BC_INST_EXECUTE: 6856 case BC_INST_EXECUTE:
6853 case BC_INST_EXEC_COND: 6857 case BC_INST_EXEC_COND:
6854 cond = inst == BC_INST_EXEC_COND; 6858 s = zbc_program_execStr(code, &ip->idx, inst == BC_INST_EXEC_COND);
6855 s = zbc_program_execStr(code, &ip->idx, cond);
6856 break; 6859 break;
6857 case BC_INST_PRINT_STACK: { 6860 case BC_INST_PRINT_STACK: {
6858 size_t idx; 6861 size_t idx;