diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-15 15:07:14 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-15 15:07:14 +0100 |
commit | fd51e0c4d22825282f3e38be0655db36b3e716d2 (patch) | |
tree | 7137b1c7c1a84d20ae1a9231fea052b6e17e31d8 | |
parent | 7db384338a803fc74a0e8eb62e9369e10a49ffdb (diff) | |
download | busybox-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.c | 21 |
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; |