diff --git a/lib/filterx/expr-generator.c b/lib/filterx/expr-generator.c index 78f9841d712..6ad401e6663 100644 --- a/lib/filterx/expr-generator.c +++ b/lib/filterx/expr-generator.c @@ -32,10 +32,27 @@ filterx_generator_set_fillable(FilterXExpr *s, FilterXExpr *fillable) self->fillable = fillable; } +static FilterXObject * +_eval(FilterXExpr *s) +{ + FilterXExprGenerator *self = (FilterXExprGenerator *) s; + + FilterXObject *fillable = filterx_expr_eval_typed(self->fillable); + if (!fillable) + return NULL; + + if (self->eval(self, fillable)) + return fillable; + + filterx_object_unref(fillable); + return NULL; +} + void filterx_generator_init_instance(FilterXExpr *s) { filterx_expr_init_instance(s); + s->eval = _eval; s->ignore_falsy_result = TRUE; } diff --git a/lib/filterx/expr-generator.h b/lib/filterx/expr-generator.h index 0630afeb595..3f58ce476fc 100644 --- a/lib/filterx/expr-generator.h +++ b/lib/filterx/expr-generator.h @@ -31,6 +31,7 @@ struct FilterXExprGenerator_ { FilterXExpr super; FilterXExpr *fillable; + gboolean (*eval)(FilterXExprGenerator *self, FilterXObject *fillable); FilterXObject *(*create_container)(FilterXExprGenerator *self, FilterXExpr *fillable_parent); }; diff --git a/lib/filterx/expr-literal-generator.c b/lib/filterx/expr-literal-generator.c index c649fdfbc46..48d9e7cb961 100644 --- a/lib/filterx/expr-literal-generator.c +++ b/lib/filterx/expr-literal-generator.c @@ -133,19 +133,12 @@ _list_generator_create_container(FilterXExprGenerator *s, FilterXExpr *fillable_ return result; } -static FilterXObject * -_literal_generator_eval(FilterXExpr *s) +static gboolean +_literal_generator_eval(FilterXExprGenerator *s, FilterXObject *fillable) { FilterXExprLiteralGenerator *self = (FilterXExprLiteralGenerator *) s; - FilterXObject *fillable = filterx_expr_eval_typed(self->super.fillable); - if (!fillable) - return NULL; - - if (!_eval_elements(fillable, self->elements)) - return NULL; - - return fillable; + return _eval_elements(fillable, self->elements); } void @@ -161,7 +154,7 @@ static void _literal_generator_init_instance(FilterXExprLiteralGenerator *self) { filterx_generator_init_instance(&self->super.super); - self->super.super.eval = _literal_generator_eval; + self->super.eval = _literal_generator_eval; self->super.super.free_fn = _literal_generator_free; } diff --git a/lib/filterx/expr-regexp.c b/lib/filterx/expr-regexp.c index a5628952d29..99b106e215a 100644 --- a/lib/filterx/expr-regexp.c +++ b/lib/filterx/expr-regexp.c @@ -336,36 +336,30 @@ typedef struct FilterXExprRegexpSearchGenerator_ pcre2_code_8 *pattern; } FilterXExprRegexpSearchGenerator; -static FilterXObject * -_regexp_search_generator_eval(FilterXExpr *s) +static gboolean +_regexp_search_generator_eval(FilterXExprGenerator *s, FilterXObject *fillable) { FilterXExprRegexpSearchGenerator *self = (FilterXExprRegexpSearchGenerator *) s; - FilterXObject *fillable = filterx_expr_eval_typed(self->super.fillable); - if (!fillable) - return NULL; - - FilterXObject *result = NULL; + gboolean result; FilterXReMatchState state; _state_init(&state); gboolean matched = _match(self->lhs, self->pattern, &state); - if (!state.match_data) + if (!matched) { - /* Error happened during matching. */ + result = TRUE; goto exit; } - if (matched) + if (!state.match_data) { - if (!_store_matches(self->pattern, &state, fillable)) - { - filterx_object_unref(fillable); - goto exit; - } + /* Error happened during matching. */ + result = FALSE; + goto exit; } - result = fillable; + result = _store_matches(self->pattern, &state, fillable); exit: _state_cleanup(&state); @@ -409,7 +403,7 @@ filterx_expr_regexp_search_generator_new(FilterXExpr *lhs, const gchar *pattern) FilterXExprRegexpSearchGenerator *self = g_new0(FilterXExprRegexpSearchGenerator, 1); filterx_generator_init_instance(&self->super.super); - self->super.super.eval = _regexp_search_generator_eval; + self->super.eval = _regexp_search_generator_eval; self->super.super.free_fn = _regexp_search_generator_free; self->super.create_container = _regexp_search_generator_create_container;