summaryrefslogtreecommitdiffhomepage
path: root/miscutils/bc.c
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 /miscutils/bc.c
parent7db384338a803fc74a0e8eb62e9369e10a49ffdb (diff)
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>
Diffstat (limited to 'miscutils/bc.c')
-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)
BcInstPtr *ip = bc_vec_top(&G.prog.stack);
BcFunc *func = bc_program_func(ip->func);
char *code = func->code.v;
- bool cond = false;
while (ip->idx < func->code.len) {
BcStatus s = BC_STATUS_SUCCESS;
@@ -6723,17 +6722,22 @@ static BC_STATUS zbc_program_exec(void)
switch (inst) {
#if ENABLE_BC
- case BC_INST_JUMP_ZERO:
+ case BC_INST_JUMP_ZERO: {
+ bool zero;
s = zbc_program_prep(&ptr, &num);
if (s) RETURN_STATUS(s);
- cond = !bc_num_cmp(num, &G.prog.zero);
+ zero = (bc_num_cmp(num, &G.prog.zero) == 0);
bc_vec_pop(&G.prog.results);
- // Fallthrough.
+ if (!zero) {
+ bc_program_index(code, &ip->idx);
+ break;
+ }
+ // else: fall through
+ }
case BC_INST_JUMP: {
- size_t *addr;
size_t idx = bc_program_index(code, &ip->idx);
- addr = bc_vec_item(&func->labels, idx);
- if (inst == BC_INST_JUMP || cond) ip->idx = *addr;
+ size_t *addr = bc_vec_item(&func->labels, idx);
+ ip->idx = *addr;
break;
}
case BC_INST_CALL:
@@ -6851,8 +6855,7 @@ static BC_STATUS zbc_program_exec(void)
break;
case BC_INST_EXECUTE:
case BC_INST_EXEC_COND:
- cond = inst == BC_INST_EXEC_COND;
- s = zbc_program_execStr(code, &ip->idx, cond);
+ s = zbc_program_execStr(code, &ip->idx, inst == BC_INST_EXEC_COND);
break;
case BC_INST_PRINT_STACK: {
size_t idx;