summaryrefslogtreecommitdiffhomepage
path: root/miscutils
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2019-01-04 06:18:00 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2019-01-04 06:18:00 +0100
commit1db367a8e65a74277360a89885ff7d377b5feb8b (patch)
treee911cbe5e1b234e38cd68e63f4a4afea1495e980 /miscutils
parent6842c6062a201cc34a262b4c450cf8e1374e9e3a (diff)
dc: fit returning of string
function old new delta zxc_program_exec 4087 4098 +11 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'miscutils')
-rw-r--r--miscutils/bc.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 1e8056c01..e497b0d02 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -6020,6 +6020,9 @@ static BC_STATUS zbc_program_return(char inst)
BcInstPtr *ip = bc_vec_top(&G.prog.exestack);
if (inst == XC_INST_RET) {
+ // bc needs this for e.g. RESULT_CONSTANT ("return 5")
+ // because bc constants are per-function.
+ // TODO: maybe avoid if value is already RESULT_TEMP?
BcStatus s;
BcNum *num;
BcResult *operand = bc_vec_top(&G.prog.results);
@@ -6458,7 +6461,17 @@ static BC_STATUS zxc_program_exec(void)
dbg_exec("inst at %zd:%d results.len:%d", ip->inst_idx - 1, inst, G.prog.results.len);
switch (inst) {
+ case XC_INST_RET:
+ if (IS_DC) { // end of '?' reached
+ bc_vec_pop(&G.prog.exestack);
+ goto read_updated_ip;
+ }
+ // bc: fall through
#if ENABLE_BC
+ case BC_INST_RET0:
+ dbg_exec("BC_INST_RET[0]:");
+ s = zbc_program_return(inst);
+ goto read_updated_ip;
case BC_INST_JUMP_ZERO: {
BcNum *num;
bool zero;
@@ -6495,11 +6508,6 @@ static BC_STATUS zxc_program_exec(void)
dbg_exec("BC_INST_HALT:");
QUIT_OR_RETURN_TO_MAIN;
break;
- case XC_INST_RET:
- case BC_INST_RET0:
- dbg_exec("BC_INST_RET[0]:");
- s = zbc_program_return(inst);
- goto read_updated_ip;
case XC_INST_BOOL_OR:
case XC_INST_BOOL_AND:
#endif // ENABLE_BC