Skip to content

Commit 5ababe6

Browse files
authored
Merge pull request #651 from bazsi/filterx-compact-expr-list
2 parents ed42bf4 + 78fd9dc commit 5ababe6

9 files changed

Lines changed: 487 additions & 83 deletions

File tree

lib/filterx/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ set(FILTERX_HEADERS
3232
filterx/filterx-error.h
3333
filterx/filterx-eval.h
3434
filterx/filterx-expr.h
35+
filterx/filterx-plist.h
3536
filterx/filterx-globals.h
3637
filterx/filterx-metrics-labels.h
3738
filterx/filterx-metrics.h
@@ -110,6 +111,7 @@ set(FILTERX_SOURCES
110111
filterx/filterx-error.c
111112
filterx/filterx-eval.c
112113
filterx/filterx-expr.c
114+
filterx/filterx-plist.c
113115
filterx/filterx-globals.c
114116
filterx/filterx-metrics-labels.c
115117
filterx/filterx-metrics.c

lib/filterx/Makefile.am

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ filterxinclude_HEADERS = \
3434
lib/filterx/filterx-error.h \
3535
lib/filterx/filterx-eval.h \
3636
lib/filterx/filterx-expr.h \
37+
lib/filterx/filterx-plist.h \
3738
lib/filterx/filterx-globals.h \
3839
lib/filterx/filterx-metrics-labels.h \
3940
lib/filterx/filterx-metrics.h \
@@ -111,6 +112,7 @@ filterx_sources = \
111112
lib/filterx/filterx-error.c \
112113
lib/filterx/filterx-eval.c \
113114
lib/filterx/filterx-expr.c \
115+
lib/filterx/filterx-plist.c \
114116
lib/filterx/filterx-globals.c \
115117
lib/filterx/filterx-grammar.y \
116118
lib/filterx/filterx-metrics-labels.c \

lib/filterx/expr-compound.c

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*/
2323

2424
#include "filterx/expr-compound.h"
25+
#include "filterx/filterx-plist.h"
2526
#include "filterx/filterx-eval.h"
2627
#include "filterx/object-primitive.h"
2728
#include "scratch-buffers.h"
@@ -33,10 +34,9 @@
3334
typedef struct _FilterXCompoundExpr
3435
{
3536
FilterXExpr super;
37+
FilterXExprList exprs;
3638
/* whether this is a statement expression */
3739
gboolean return_value_of_last_expr;
38-
GPtrArray *exprs;
39-
4040
} FilterXCompoundExpr;
4141

4242
static gboolean
@@ -86,12 +86,12 @@ _eval_exprs(FilterXCompoundExpr *self, FilterXObject **result, gsize start_index
8686
FilterXEvalContext *context = filterx_eval_get_context();
8787

8888
*result = NULL;
89-
gsize len = self->exprs->len;
90-
for (gsize i = start_index; i < len; i++)
89+
gsize exprs_len = filterx_expr_list_get_length(&self->exprs);
90+
for (gsize i = start_index; i < exprs_len; i++)
9191
{
9292
filterx_object_unref(*result);
9393

94-
FilterXExpr *expr = g_ptr_array_index(self->exprs, i);
94+
FilterXExpr *expr = filterx_expr_list_index_fast(&self->exprs, i);
9595
if (!_eval_expr(expr, result))
9696
return FALSE;
9797

@@ -156,38 +156,41 @@ filterx_compound_expr_eval_ext(FilterXExpr *s, gsize start_index)
156156
return _eval_compound_start(self, start_index);
157157
}
158158

159+
static gboolean
160+
_optimize_expr(FilterXExpr **pexpr, gpointer user_data)
161+
{
162+
*pexpr = filterx_expr_optimize(*pexpr);
163+
return TRUE;
164+
}
165+
159166
static FilterXExpr *
160167
_optimize(FilterXExpr *s)
161168
{
162169
FilterXCompoundExpr *self = (FilterXCompoundExpr *) s;
163170

164-
for (gint i = 0; i < self->exprs->len; i++)
165-
{
166-
FilterXExpr **expr = (FilterXExpr **) &g_ptr_array_index(self->exprs, i);
167-
*expr = filterx_expr_optimize(*expr);
168-
}
171+
filterx_expr_list_foreach_ref(&self->exprs, _optimize_expr, NULL);
169172
return NULL;
170173
}
171174

175+
static gboolean
176+
_invoke_deinit(FilterXExpr *expr, gpointer cfg)
177+
{
178+
filterx_expr_deinit(expr, (GlobalConfig *) cfg);
179+
return TRUE;
180+
}
181+
172182
static gboolean
173183
_init(FilterXExpr *s, GlobalConfig *cfg)
174184
{
175185
FilterXCompoundExpr *self = (FilterXCompoundExpr *) s;
176186

177-
for (gint i = 0; i < self->exprs->len; i++)
187+
filterx_expr_list_seal(&self->exprs);
188+
189+
if (!filterx_expr_list_foreach(&self->exprs, (FilterXExprListForeachFunc) filterx_expr_init, cfg))
178190
{
179-
FilterXExpr *expr = g_ptr_array_index(self->exprs, i);
180-
if (!filterx_expr_init(expr, cfg))
181-
{
182-
for (gint j = 0; j < i; j++)
183-
{
184-
expr = g_ptr_array_index(self->exprs, j);
185-
filterx_expr_deinit(expr, cfg);
186-
}
187-
return FALSE;
188-
}
191+
filterx_expr_list_foreach(&self->exprs, _invoke_deinit, cfg);
192+
return FALSE;
189193
}
190-
191194
return filterx_expr_init_method(s, cfg);
192195
}
193196

@@ -196,12 +199,7 @@ _deinit(FilterXExpr *s, GlobalConfig *cfg)
196199
{
197200
FilterXCompoundExpr *self = (FilterXCompoundExpr *) s;
198201

199-
for (gint i = 0; i < self->exprs->len; i++)
200-
{
201-
FilterXExpr *expr = g_ptr_array_index(self->exprs, i);
202-
filterx_expr_deinit(expr, cfg);
203-
}
204-
202+
filterx_expr_list_foreach(&self->exprs, _invoke_deinit, cfg);
205203
filterx_expr_deinit_method(s, cfg);
206204
}
207205

@@ -210,7 +208,7 @@ _free(FilterXExpr *s)
210208
{
211209
FilterXCompoundExpr *self = (FilterXCompoundExpr *) s;
212210

213-
g_ptr_array_free(self->exprs, TRUE);
211+
filterx_expr_list_clear(&self->exprs);
214212
filterx_expr_free_method(s);
215213
}
216214

@@ -220,15 +218,15 @@ gsize
220218
filterx_compound_expr_get_count(FilterXExpr *s)
221219
{
222220
FilterXCompoundExpr *self = (FilterXCompoundExpr *) s;
223-
return self->exprs->len;
221+
return filterx_expr_list_get_length(&self->exprs);
224222
}
225223

226224
void
227225
filterx_compound_expr_add(FilterXExpr *s, FilterXExpr *expr)
228226
{
229227
FilterXCompoundExpr *self = (FilterXCompoundExpr *) s;
230228

231-
g_ptr_array_add(self->exprs, expr);
229+
filterx_expr_list_add(&self->exprs, expr);
232230
}
233231

234232
/* Takes reference of expr_list */
@@ -253,8 +251,8 @@ filterx_compound_expr_new(gboolean return_value_of_last_expr)
253251
self->super.init = _init;
254252
self->super.deinit = _deinit;
255253
self->super.free_fn = _free;
256-
self->exprs = g_ptr_array_new_with_free_func((GDestroyNotify) filterx_expr_unref);
257254
self->return_value_of_last_expr = return_value_of_last_expr;
255+
filterx_expr_list_init(&self->exprs);
258256

259257
return &self->super;
260258
}

0 commit comments

Comments
 (0)