@@ -65,6 +65,7 @@ delete_value_from_et(fds_filter_value_u *value, eval_node_s *tree)
6565 // if the value matches by value zero it out
6666 if (memcmp (& tree -> value , value , sizeof (fds_filter_value_u )) == 0 ) {
6767 tree -> value = (fds_filter_value_u ){0 };
68+ tree -> destructor_fn = NULL ;
6869 }
6970}
7071
@@ -167,7 +168,7 @@ list_to_literal(fds_filter_ast_node_s *ast, fds_filter_opts_t *opts, fds_filter_
167168 }
168169
169170 // Evaluate each list item node and populate the list
170- int idx = 0 ;
171+ uint64_t idx = 0 ;
171172 for (fds_filter_ast_node_s * li = ast -> child ; li != NULL ; li = li -> next ) {
172173 assert (idx < out_list -> len );
173174
@@ -222,6 +223,8 @@ process_root_node(fds_filter_ast_node_s *ast, fds_filter_opts_t *opts, bool seco
222223static error_t
223224process_constructor_node (fds_filter_ast_node_s * ast , fds_filter_opts_t * opts , bool second_run , eval_node_s * * out_eval_node )
224225{
226+ (void ) second_run ;
227+
225228 // Must be const, should be assured by semantic analysis
226229 assert (ast -> flags & FDS_FAF_CONST_SUBTREE );
227230
@@ -265,6 +268,9 @@ process_constructor_node(fds_filter_ast_node_s *ast, fds_filter_opts_t *opts, bo
265268static error_t
266269process_exists_node (fds_filter_ast_node_s * ast , fds_filter_opts_t * opts , bool second_run , eval_node_s * * out_eval_node )
267270{
271+ (void ) second_run ;
272+ (void ) opts ;
273+
268274 // Must have a __name__ node as its only child
269275 assert (ast_node_symbol_is (ast -> child , "__name__" ));
270276
@@ -286,6 +292,8 @@ process_exists_node(fds_filter_ast_node_s *ast, fds_filter_opts_t *opts, bool se
286292static error_t
287293process_name_node (fds_filter_ast_node_s * ast , fds_filter_opts_t * opts , bool second_run , eval_node_s * * out_eval_node )
288294{
295+ (void ) second_run ;
296+
289297 eval_node_s * en = create_eval_node ();
290298 if (!en ) {
291299 return MEMORY_ERROR ;
@@ -309,6 +317,8 @@ process_name_node(fds_filter_ast_node_s *ast, fds_filter_opts_t *opts, bool seco
309317static error_t
310318process_literal_node (fds_filter_ast_node_s * ast , fds_filter_opts_t * opts , bool second_run , eval_node_s * * out_eval_node )
311319{
320+ (void ) second_run ;
321+
312322 eval_node_s * en = create_eval_node ();
313323 if (!en ) {
314324 return MEMORY_ERROR ;
@@ -332,6 +342,8 @@ process_literal_node(fds_filter_ast_node_s *ast, fds_filter_opts_t *opts, bool s
332342static error_t
333343process_list_node (fds_filter_ast_node_s * ast , fds_filter_opts_t * opts , bool second_run , eval_node_s * * out_eval_node )
334344{
345+ (void ) second_run ;
346+
335347 eval_node_s * en = create_eval_node ();
336348 if (!en ) {
337349 return MEMORY_ERROR ;
@@ -473,9 +485,17 @@ generate_eval_tree(fds_filter_ast_node_s *ast, fds_filter_opts_t *opts, bool sec
473485 en -> opcode = EVAL_OP_NONE ;
474486 IF_DEBUG (en -> datatype = ast -> datatype ;)
475487 error_t err = ast_to_literal (ast , opts , & en -> value );
488+ if (err != NO_ERROR ) {
489+ destroy_eval_node (en );
490+ return err ;
491+ }
492+ fds_filter_op_s * destructor = find_destructor (opts -> op_list , ast -> datatype );
493+ if (destructor ) {
494+ en -> destructor_fn = destructor -> destructor_fn ;
495+ }
476496 * out_eval_node = en ;
477497
478- // ast->flags &= ~FDS_FAF_DESTROY_VAL;
498+ ast -> flags &= ~FDS_FAF_DESTROY_VAL ;
479499
480500 return NO_ERROR ;
481501 }
0 commit comments