bc: optimize bc_vec_push() usage
function old new delta bc_parse_pushNUM 87 80 -7 zbc_parse_stmt_possibly_auto 1697 1689 -8 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-15) Total: -15 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
19eee8ed7c
commit
6ed7fb0a87
@ -1097,24 +1097,25 @@ static void bc_vec_pop_all(BcVec *v)
|
|||||||
bc_vec_npop(v, v->len);
|
bc_vec_npop(v, v->len);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: return index of pushed data - many callers can use that
|
static size_t bc_vec_push(BcVec *v, const void *data)
|
||||||
static void bc_vec_push(BcVec *v, const void *data)
|
|
||||||
{
|
{
|
||||||
if (v->len + 1 > v->cap) bc_vec_grow(v, 1);
|
size_t len = v->len;
|
||||||
memmove(v->v + (v->size * v->len), data, v->size);
|
if (len >= v->cap) bc_vec_grow(v, 1);
|
||||||
v->len += 1;
|
memmove(v->v + (v->size * len), data, v->size);
|
||||||
|
v->len++;
|
||||||
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bc_vec_pushByte(BcVec *v, char data)
|
static size_t bc_vec_pushByte(BcVec *v, char data)
|
||||||
{
|
{
|
||||||
bc_vec_push(v, &data);
|
return bc_vec_push(v, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bc_vec_pushZeroByte(BcVec *v)
|
static size_t bc_vec_pushZeroByte(BcVec *v)
|
||||||
{
|
{
|
||||||
//bc_vec_pushByte(v, '\0');
|
//return bc_vec_pushByte(v, '\0');
|
||||||
// better:
|
// better:
|
||||||
bc_vec_push(v, &const_int_0);
|
return bc_vec_push(v, &const_int_0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bc_vec_pushAt(BcVec *v, const void *data, size_t idx)
|
static void bc_vec_pushAt(BcVec *v, const void *data, size_t idx)
|
||||||
@ -3548,14 +3549,11 @@ static void bc_parse_pushNUM(BcParse *p)
|
|||||||
{
|
{
|
||||||
char *num = xstrdup(p->l.t.v.v);
|
char *num = xstrdup(p->l.t.v.v);
|
||||||
#if ENABLE_BC && ENABLE_DC
|
#if ENABLE_BC && ENABLE_DC
|
||||||
size_t idx = IS_BC ? p->func->consts.len : G.prog.consts.len;
|
size_t idx = bc_vec_push(IS_BC ? &p->func->consts : &G.prog.consts, &num);
|
||||||
bc_vec_push(IS_BC ? &p->func->consts : &G.prog.consts, &num);
|
|
||||||
#elif ENABLE_BC
|
#elif ENABLE_BC
|
||||||
size_t idx = p->func->consts.len;
|
size_t idx = bc_vec_push(&p->func->consts, &num);
|
||||||
bc_vec_push(&p->func->consts, &num);
|
|
||||||
#else // DC
|
#else // DC
|
||||||
size_t idx = G.prog.consts.len;
|
size_t idx = bc_vec_push(&G.prog.consts, &num);
|
||||||
bc_vec_push(&G.prog.consts, &num);
|
|
||||||
#endif
|
#endif
|
||||||
bc_parse_push(p, BC_INST_NUM);
|
bc_parse_push(p, BC_INST_NUM);
|
||||||
bc_parse_pushIndex(p, idx);
|
bc_parse_pushIndex(p, idx);
|
||||||
@ -3652,7 +3650,7 @@ static void bc_program_add_fn(void)
|
|||||||
//size_t idx;
|
//size_t idx;
|
||||||
BcFunc f;
|
BcFunc f;
|
||||||
bc_func_init(&f);
|
bc_func_init(&f);
|
||||||
//idx = G.prog.fns.len;
|
//idx =
|
||||||
bc_vec_push(&G.prog.fns, &f);
|
bc_vec_push(&G.prog.fns, &f);
|
||||||
//return idx;
|
//return idx;
|
||||||
}
|
}
|
||||||
@ -4135,12 +4133,13 @@ static BC_STATUS zbc_parse_if(BcParse *p)
|
|||||||
if (s) RETURN_STATUS(s);
|
if (s) RETURN_STATUS(s);
|
||||||
s = zbc_parse_expr(p, BC_PARSE_REL);
|
s = zbc_parse_expr(p, BC_PARSE_REL);
|
||||||
if (s) RETURN_STATUS(s);
|
if (s) RETURN_STATUS(s);
|
||||||
|
|
||||||
if (p->l.t.t != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token());
|
if (p->l.t.t != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token());
|
||||||
|
|
||||||
ip_idx = p->func->labels.len;
|
// Encode "if zero, jump to ..."
|
||||||
|
// Pushed value (destination of the jump) is uninitialized,
|
||||||
|
// will be rewritten to be address of "end of if()" or of "else".
|
||||||
|
ip_idx = bc_vec_push(&p->func->labels, &ip_idx);
|
||||||
bc_parse_pushJUMP_ZERO(p, ip_idx);
|
bc_parse_pushJUMP_ZERO(p, ip_idx);
|
||||||
bc_vec_push(&p->func->labels, &ip_idx);
|
|
||||||
|
|
||||||
s = zbc_parse_stmt_allow_NLINE_before(p, STRING_if);
|
s = zbc_parse_stmt_allow_NLINE_before(p, STRING_if);
|
||||||
if (s) RETURN_STATUS(s);
|
if (s) RETURN_STATUS(s);
|
||||||
@ -4149,15 +4148,14 @@ static BC_STATUS zbc_parse_if(BcParse *p)
|
|||||||
if (p->l.t.t == BC_LEX_KEY_ELSE) {
|
if (p->l.t.t == BC_LEX_KEY_ELSE) {
|
||||||
size_t ip2_idx;
|
size_t ip2_idx;
|
||||||
|
|
||||||
ip2_idx = p->func->labels.len;
|
// Encode "after then_stmt, jump to end of if()"
|
||||||
|
ip2_idx = bc_vec_push(&p->func->labels, &ip2_idx);
|
||||||
dbg_lex("%s:%d after if() body: BC_INST_JUMP to %zd", __func__, __LINE__, ip2_idx);
|
dbg_lex("%s:%d after if() then_stmt: BC_INST_JUMP to %zd", __func__, __LINE__, ip2_idx);
|
||||||
bc_parse_pushJUMP(p, ip2_idx);
|
bc_parse_pushJUMP(p, ip2_idx);
|
||||||
|
|
||||||
dbg_lex("%s:%d rewriting 'if_zero' label to jump to 'else'-> %zd", __func__, __LINE__, p->func->code.len);
|
dbg_lex("%s:%d rewriting 'if_zero' label to jump to 'else'-> %zd", __func__, __LINE__, p->func->code.len);
|
||||||
rewrite_label_to_current(p, ip_idx);
|
rewrite_label_to_current(p, ip_idx);
|
||||||
|
|
||||||
bc_vec_push(&p->func->labels, &ip2_idx);
|
|
||||||
ip_idx = ip2_idx;
|
ip_idx = ip2_idx;
|
||||||
|
|
||||||
s = zbc_parse_stmt_allow_NLINE_before(p, STRING_else);
|
s = zbc_parse_stmt_allow_NLINE_before(p, STRING_else);
|
||||||
@ -4184,10 +4182,8 @@ static BC_STATUS zbc_parse_while(BcParse *p)
|
|||||||
s = zbc_lex_next(&p->l);
|
s = zbc_lex_next(&p->l);
|
||||||
if (s) RETURN_STATUS(s);
|
if (s) RETURN_STATUS(s);
|
||||||
|
|
||||||
cond_idx = p->func->labels.len;
|
cond_idx = bc_vec_push(&p->func->labels, &p->func->code.len);
|
||||||
ip_idx = cond_idx + 1;
|
ip_idx = cond_idx + 1;
|
||||||
|
|
||||||
bc_vec_push(&p->func->labels, &p->func->code.len);
|
|
||||||
bc_vec_push(&p->conds, &cond_idx);
|
bc_vec_push(&p->conds, &cond_idx);
|
||||||
|
|
||||||
bc_vec_push(&p->exits, &ip_idx);
|
bc_vec_push(&p->exits, &ip_idx);
|
||||||
@ -4240,13 +4236,11 @@ static BC_STATUS zbc_parse_for(BcParse *p)
|
|||||||
s = zbc_lex_next(&p->l);
|
s = zbc_lex_next(&p->l);
|
||||||
if (s) RETURN_STATUS(s);
|
if (s) RETURN_STATUS(s);
|
||||||
|
|
||||||
cond_idx = p->func->labels.len;
|
cond_idx = bc_vec_push(&p->func->labels, &p->func->code.len);
|
||||||
update_idx = cond_idx + 1;
|
update_idx = cond_idx + 1;
|
||||||
body_idx = update_idx + 1;
|
body_idx = update_idx + 1;
|
||||||
exit_idx = body_idx + 1;
|
exit_idx = body_idx + 1;
|
||||||
|
|
||||||
bc_vec_push(&p->func->labels, &p->func->code.len);
|
|
||||||
|
|
||||||
if (p->l.t.t != BC_LEX_SCOLON)
|
if (p->l.t.t != BC_LEX_SCOLON)
|
||||||
s = zbc_parse_expr(p, BC_PARSE_REL);
|
s = zbc_parse_expr(p, BC_PARSE_REL);
|
||||||
else {
|
else {
|
||||||
@ -4272,14 +4266,14 @@ static BC_STATUS zbc_parse_for(BcParse *p)
|
|||||||
|
|
||||||
if (p->l.t.t != BC_LEX_RPAREN) {
|
if (p->l.t.t != BC_LEX_RPAREN) {
|
||||||
s = zbc_parse_expr(p, 0);
|
s = zbc_parse_expr(p, 0);
|
||||||
bc_parse_push(p, BC_INST_POP);
|
|
||||||
if (s) RETURN_STATUS(s);
|
if (s) RETURN_STATUS(s);
|
||||||
|
if (p->l.t.t != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token());
|
||||||
|
bc_parse_push(p, BC_INST_POP);
|
||||||
} else {
|
} else {
|
||||||
s = bc_POSIX_does_not_allow_empty_X_expression_in_for("update");
|
s = bc_POSIX_does_not_allow_empty_X_expression_in_for("update");
|
||||||
IF_ERROR_RETURN_POSSIBLE(if (s) RETURN_STATUS(s);)
|
IF_ERROR_RETURN_POSSIBLE(if (s) RETURN_STATUS(s);)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->l.t.t != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token());
|
|
||||||
bc_parse_pushJUMP(p, cond_idx);
|
bc_parse_pushJUMP(p, cond_idx);
|
||||||
bc_vec_push(&p->func->labels, &p->func->code.len);
|
bc_vec_push(&p->func->labels, &p->func->code.len);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user