Skip to content

Commit d9f7ff2

Browse files
committed
Expression engine: fixes for evaluation optimization.
1 parent 49c68e8 commit d9f7ff2

3 files changed

Lines changed: 18 additions & 4 deletions

File tree

src/expression.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ void mpr_expr_set_var_updated(mpr_expr expr, int var_idx)
262262
&& var_idx != expr->mute_ctl);
263263
expr->vars[var_idx].flags |= VAR_SET_EXTERN;
264264
/* Reset expression offset to 0 in case other variables are initialised from this one. */
265-
expr->stack->init_offset = 0;
265+
expr->stack->initialized = 0;
266266
return;
267267
}
268268

src/expression/expr_evaluator.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,19 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
117117
uint8_t *lens = buff->lens;
118118
mpr_type *types = buff->types;
119119

120-
if (v_out && mpr_value_get_num_samps(v_out, inst_idx) > 0) {
121-
tok += stk->init_offset;
120+
if (v_out) {
121+
if (stk->initialized) {
122+
#if TRACE_EVAL
123+
printf("advancing start token to %d\n", stk->init_offset);
124+
#endif
125+
tok += stk->init_offset;
126+
}
127+
else {
128+
#if TRACE_EVAL
129+
printf("initializing from token 0\n");
130+
#endif
131+
stk->initialized = 1;
132+
}
122133
}
123134

124135
if (v_vars) {

src/expression/expr_stack.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ typedef struct _estack
1313
uint8_t num_tokens;
1414
uint8_t size;
1515
uint8_t vec_len;
16+
uint8_t initialized;
1617
} estack_t, *estack;
1718

1819
#if TRACE_PARSE
@@ -34,6 +35,7 @@ void estack_cpy(estack to, estack from)
3435
to->num_tokens = from->num_tokens;
3536
to->vec_len = from->vec_len;
3637
to->init_offset = from->init_offset;
38+
to->initialized = from->initialized;
3739
to->tokens = malloc(sizeof(etoken_t) * (size_t)from->num_tokens);
3840
memcpy(to->tokens, from->tokens, sizeof(etoken_t) * (size_t)from->num_tokens);
3941

@@ -259,6 +261,7 @@ static int precompute(estack stk, uint8_t num_tokens_to_compute)
259261

260262
/* temporarily set the stk 'offset' variable */
261263
stk->init_offset = stk->num_tokens - num_tokens_to_compute;
264+
stk->initialized = 1;
262265
stk->vec_len = vec_len;
263266
expr = mpr_expr_new(0, 0, stk);
264267
buff = mpr_expr_new_eval_buffer(expr);
@@ -310,13 +313,13 @@ static int precompute(estack stk, uint8_t num_tokens_to_compute)
310313
tok->gen.datatype = type;
311314
tok->gen.vec_len = vec_len;
312315
stk->num_tokens = stk->init_offset + 1;
313-
stk->init_offset = 0;
314316

315317
done:
316318
mpr_value_free(val);
317319
mpr_expr_free(expr);
318320
mpr_expr_free_eval_buffer(buff);
319321
stk->init_offset = 0;
322+
stk->initialized = 0;
320323
return ret;
321324
}
322325

0 commit comments

Comments
 (0)