bc: remove extra div/0 test, remove test for string function parameter

function                                             old     new   delta
zbc_program_call                                     354     332     -22
zxc_program_assign                                   426     385     -41
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-63)             Total: -63 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2019-01-04 00:05:07 +01:00
parent 96b5ec10fb
commit 19c3eb0b04

View File

@ -5793,9 +5793,6 @@ static BC_STATUS zxc_program_assign(char inst)
RETURN_STATUS(bc_error_bad_assignment()); RETURN_STATUS(bc_error_bad_assignment());
#if ENABLE_BC #if ENABLE_BC
if (inst == BC_INST_ASSIGN_DIVIDE && !bc_num_cmp(r, &G.prog.zero))
RETURN_STATUS(bc_error("divide by zero"));
if (assign) if (assign)
bc_num_copy(l, r); bc_num_copy(l, r);
else { else {
@ -5960,12 +5957,10 @@ static BC_STATUS zbc_program_call(char *code, size_t *idx)
{ {
BcInstPtr ip; BcInstPtr ip;
size_t i, nparams; size_t i, nparams;
BcFunc *func;
BcId *a; BcId *a;
BcResult *arg; BcFunc *func;
nparams = xc_program_index(code, idx); nparams = xc_program_index(code, idx);
ip.inst_idx = 0;
ip.func = xc_program_index(code, idx); ip.func = xc_program_index(code, idx);
func = xc_program_func(ip.func); func = xc_program_func(ip.func);
@ -5975,17 +5970,21 @@ static BC_STATUS zbc_program_call(char *code, size_t *idx)
if (nparams != func->nparams) { if (nparams != func->nparams) {
RETURN_STATUS(bc_error_fmt("function has %u parameters, but called with %u", func->nparams, nparams)); RETURN_STATUS(bc_error_fmt("function has %u parameters, but called with %u", func->nparams, nparams));
} }
ip.inst_idx = 0;
ip.results_len_before_call = G.prog.results.len - nparams; ip.results_len_before_call = G.prog.results.len - nparams;
for (i = 0; i < nparams; ++i) { for (i = 0; i < nparams; ++i) {
BcResult *arg;
BcStatus s; BcStatus s;
a = bc_vec_item(&func->autos, nparams - 1 - i); a = bc_vec_item(&func->autos, nparams - 1 - i);
arg = bc_vec_top(&G.prog.results); arg = bc_vec_top(&G.prog.results);
if ((!a->idx) != (arg->t == XC_RESULT_ARRAY) || arg->t == XC_RESULT_STR) if ((!a->idx) != (arg->t == XC_RESULT_ARRAY) // array/variable mismatch
// || arg->t == XC_RESULT_STR - impossible, f("str") is not a legal syntax (strings are not bc expressions)
) {
RETURN_STATUS(bc_error_variable_is_wrong_type()); RETURN_STATUS(bc_error_variable_is_wrong_type());
}
s = zxc_program_copyToVar(a->name, a->idx); s = zxc_program_copyToVar(a->name, a->idx);
if (s) RETURN_STATUS(s); if (s) RETURN_STATUS(s);
} }