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"
3334typedef 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
4242static 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+
159166static 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+
172182static 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
220218filterx_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
226224void
227225filterx_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