@@ -109,7 +109,7 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
109109 etoken_t * tok = stk -> tokens , * end = tok + stk -> num_tokens ;
110110 int dp = -1 , sp = - stk -> vec_len , status = 1 | EXPR_EVAL_DONE ;
111111 /* Note: signal, history, and vector reduce are currently limited to 255 items here */
112- uint8_t alive = 1 , muted = 0 , can_advance = 1 , cache = 0 , vlen = stk -> vec_len ;
112+ uint8_t alive = 1 , muted = 0 , cache = 0 , vlen = stk -> vec_len ;
113113 uint8_t hist_offset = 0 , sig_offset = 0 , vec_offset = 0 ;
114114 mpr_value x = NULL ;
115115
@@ -118,7 +118,7 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
118118 mpr_type * types = buff -> types ;
119119
120120 if (v_out && mpr_value_get_num_samps (v_out , inst_idx ) > 0 ) {
121- tok += stk -> offset ;
121+ tok += stk -> init_offset ;
122122 }
123123
124124 if (v_vars ) {
@@ -215,15 +215,31 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
215215 if (VAR_Y == tok -> var .idx ) {
216216 RETURN_ARG_UNLESS (v_out , status );
217217 v = v_out ;
218- can_advance = 0 ;
219218#if TRACE_EVAL
220219 printf ("[y]" );
221220#endif
222221 }
222+ else if (VAR_NOW == tok -> var .idx ) {
223+ int i ;
224+ double t_d ;
225+ RETURN_ARG_UNLESS (time , status );
226+ #if TRACE_EVAL
227+ printf ("[now]" );
228+ #endif
229+ SET_STACK_PTR (idxp + 1 );
230+ t_d = mpr_time_as_dbl (* time );
231+ for (i = sp ; i < sp + tok -> gen .vec_len ; i ++ )
232+ vals [i ].d = t_d ;
233+ SET_TYPE (MPR_DBL );
234+ SET_LEN (tok -> gen .vec_len );
235+ #if TRACE_EVAL
236+ evalue_print (vals + sp , types [dp ], lens [dp ], dp );
237+ #endif
238+ break ;
239+ }
223240 else if (VAR_NEXT == tok -> var .idx ) {
224241 RETURN_ARG_UNLESS (v_next , status );
225242 v = v_next ;
226- can_advance = 0 ;
227243#if TRACE_EVAL
228244 printf ("[next]" );
229245#endif
@@ -259,7 +275,6 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
259275 else
260276 goto error ;
261277 }
262- can_advance = 0 ;
263278
264279 /* If no instance idx is cached this means that this expression contains a
265280 * non-reducing reference to the variable x, and that mpr_expr_eval() should be
@@ -269,7 +284,6 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
269284 }
270285 else if (v_vars ) {
271286 v = v_vars [tok -> var .idx ];
272- can_advance = 0 ;
273287#if TRACE_EVAL
274288 if (expr -> vars && expr -> vars [tok -> var .idx ].name )
275289 printf ("[%d:%s]" , tok -> var .idx , expr -> vars [tok -> var .idx ].name );
@@ -451,7 +465,6 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
451465 goto error ;
452466 for (i = 1 ; i < tok -> gen .vec_len ; i ++ )
453467 vals [sp + i ].i = vals [sp ].i ;
454- can_advance = 0 ;
455468#if TRACE_EVAL
456469 evalue_print (vals + sp , types [dp ], lens [dp ], dp );
457470#endif
@@ -615,8 +628,6 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
615628 default :
616629 goto error ;
617630 }
618- if (tok -> fn .idx > FN_DEL_IDX )
619- can_advance = 0 ;
620631#if TRACE_EVAL
621632 evalue_print (vals + sp , types [dp ], lens [dp ], dp );
622633#endif
@@ -894,8 +905,6 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
894905 }
895906 case TOK_ASSIGN :
896907 case TOK_ASSIGN_USE :
897- if (VAR_Y == tok -> var .idx )
898- can_advance = 0 ;
899908 case TOK_ASSIGN_CONST : {
900909 mpr_value v ;
901910 /* currently only history and vector indices are supported for assignment */
@@ -914,7 +923,6 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
914923 goto assign_done ;
915924 }
916925 status |= muted ? EXPR_MUTED_UPDATE : EXPR_UPDATE ;
917- can_advance = 0 ;
918926 if (!v_out )
919927 return status ;
920928 v = v_out ;
@@ -1014,30 +1022,16 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
10141022 status |= EXPR_RELEASE_BEFORE_UPDATE ;
10151023 }
10161024 alive = vals [sp ].i != 0 ;
1017- can_advance = 0 ;
10181025 }
10191026 else if (tok -> var .idx == expr -> mute_ctl ) {
10201027 muted = vals [sp ].i != 0 ;
1021- can_advance = 0 ;
10221028 }
10231029 else if (VAR_Y >= tok -> var .idx && !hidx ) {
10241030 /* inform value struct that it has value */
10251031 mpr_value_set_elements_known (v , inst_idx , vidx , tok -> gen .vec_len );
10261032 }
10271033
10281034 assign_done :
1029- /* If assignment was constant or history initialization, move expr
1030- * start token pointer so we don't evaluate this section again. */
1031-
1032- if (can_advance || tok -> gen .flags & VAR_HIST_IDX ) {
1033- #if TRACE_EVAL
1034- printf ("\n move start\t%ld\n" , tok - stk -> tokens + 1 );
1035- #endif
1036- stk -> offset = tok - stk -> tokens + 1 ;
1037- }
1038- else
1039- can_advance = 0 ;
1040-
10411035 if (tok -> gen .flags & CLEAR_STACK )
10421036 dp = -1 ;
10431037 else if (dp && TOK_ASSIGN_USE != tok -> toktype )
@@ -1094,16 +1088,6 @@ int mpr_expr_eval(mpr_expr expr, ebuffer buff, mpr_value *v_in, mpr_value *v_var
10941088 mpr_time_set_dbl (& t , vals [sp ].d );
10951089 mpr_value_set_time (v , t , inst_idx , hidx );
10961090
1097- /* If assignment was constant or history initialization, move expr
1098- * start token pointer so we don't evaluate this section again. */
1099- if (can_advance || tok -> gen .flags & VAR_HIST_IDX ) {
1100- #if TRACE_EVAL
1101- printf (" move start\t%ld\n" , tok - stk -> tokens + 1 );
1102- #endif
1103- stk -> offset = tok - stk -> tokens + 1 ;
1104- }
1105- else
1106- can_advance = 0 ;
11071091 if (tok -> gen .flags & CLEAR_STACK )
11081092 dp = -1 ;
11091093 else {
0 commit comments