]> git.droids-corp.org - protos/libecoli.git/commitdiff
free children in free_priv
authorOlivier Matz <zer0@droids-corp.org>
Thu, 19 Jul 2018 18:44:14 +0000 (20:44 +0200)
committerOlivier Matz <zer0@droids-corp.org>
Thu, 19 Jul 2018 18:44:14 +0000 (20:44 +0200)
lib/ecoli_node.c
lib/ecoli_node_cmd.c
lib/ecoli_node_expr.c
lib/ecoli_node_many.c
lib/ecoli_node_once.c
lib/ecoli_node_option.c
lib/ecoli_node_or.c
lib/ecoli_node_re_lex.c
lib/ecoli_node_seq.c
lib/ecoli_node_sh_lex.c
lib/ecoli_node_subset.c

index 484e25f72626e078ee85234a39b1eea741c3e990..a1b10ddf85b3275012204443bff6f8225c298fb7 100644 (file)
@@ -185,8 +185,7 @@ static void reset_mark(struct ec_node *node)
 /* free a node, taking care of loops in the node graph */
 void ec_node_free(struct ec_node *node)
 {
-       struct ec_node *child;
-       size_t i, n;
+       size_t n;
 
        if (node == NULL)
                return;
@@ -217,10 +216,10 @@ void ec_node_free(struct ec_node *node)
        if (node->free.state != EC_NODE_FREE_STATE_FREEING) {
                node->free.state = EC_NODE_FREE_STATE_FREEING;
                n = ec_node_get_children_count(node);
-               for (i = 0; i < n; i++) {
-                       child = ec_node_get_child(node, i);
-                       ec_node_free(child);
-               }
+               /* children should be freed by free_priv() */
+               assert(n == 0 || node->type->free_priv != NULL);
+               if (node->type->free_priv != NULL)
+                       node->type->free_priv(node);
        }
 
        node->refcnt--;
@@ -230,8 +229,6 @@ void ec_node_free(struct ec_node *node)
        node->free.state = EC_NODE_FREE_STATE_NONE;
        node->free.refcnt = 0;
 
-       if (node->type != NULL && node->type->free_priv != NULL)
-               node->type->free_priv(node);
        ec_free(node->id);
        ec_free(node->desc);
        ec_keyval_free(node->attrs);
index d298c14712df04a11e93df417400775eed37b7e7..5b0d4595e8883c8cc3348a70c756be94996b746c 100644 (file)
@@ -413,11 +413,10 @@ static void ec_node_cmd_free_priv(struct ec_node *gen_node)
        struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
        size_t i;
 
-       /* node->cmd is freed automatically, because it is returned
-        * by ec_node_cmd_get_child() */
        ec_free(node->cmd_str);
        ec_node_free(node->expr);
        ec_node_free(node->parser);
+       ec_node_free(node->cmd);
        for (i = 0; i < node->len; i++)
                ec_node_free(node->table[i]);
        ec_free(node->table);
index 2320c0c06dd78dc7cf208786f742a3cc9d2a5b86..eb7bff30651cd22b3912c0b31e26a425d283e05f 100644 (file)
@@ -78,7 +78,7 @@ static void ec_node_expr_free_priv(struct ec_node *gen_node)
        struct ec_node_expr *node = (struct ec_node_expr *)gen_node;
        unsigned int i;
 
-       EC_LOG(EC_LOG_DEBUG, "free %p %p %p\n", node, node->child, node->val_node);
+       ec_node_free(node->child);
        ec_node_free(node->val_node);
 
        for (i = 0; i < node->bin_ops_len; i++)
index 728f1c64f2b6c3b04344aa5dbaeb1761858be0cd..6a5f676890f4af46db18023074b92bb5ebf990e2 100644 (file)
@@ -154,6 +154,13 @@ ec_node_many_complete(const struct ec_node *gen_node,
                                strvec);
 }
 
+static void ec_node_many_free_priv(struct ec_node *gen_node)
+{
+       struct ec_node_many *node = (struct ec_node_many *)gen_node;
+
+       ec_node_free(node->child);
+}
+
 static size_t
 ec_node_many_get_children_count(const struct ec_node *gen_node)
 {
@@ -180,6 +187,7 @@ static struct ec_node_type ec_node_many_type = {
        .parse = ec_node_many_parse,
        .complete = ec_node_many_complete,
        .size = sizeof(struct ec_node_many),
+       .free_priv = ec_node_many_free_priv,
        .get_children_count = ec_node_many_get_children_count,
        .get_child = ec_node_many_get_child,
 };
index 738b43d3f5877a5a4069bdc6f661895224b135b5..5248d13bf9c989b38c3646c99e749acafd16952c 100644 (file)
@@ -88,6 +88,13 @@ ec_node_once_complete(const struct ec_node *gen_node,
        return 0;
 }
 
+static void ec_node_once_free_priv(struct ec_node *gen_node)
+{
+       struct ec_node_once *node = (struct ec_node_once *)gen_node;
+
+       ec_node_free(node->child);
+}
+
 static size_t
 ec_node_once_get_children_count(const struct ec_node *gen_node)
 {
@@ -114,6 +121,7 @@ static struct ec_node_type ec_node_once_type = {
        .parse = ec_node_once_parse,
        .complete = ec_node_once_complete,
        .size = sizeof(struct ec_node_once),
+       .free_priv = ec_node_once_free_priv,
        .get_children_count = ec_node_once_get_children_count,
        .get_child = ec_node_once_get_child,
 };
index b4bb391d8c4b2fbd319307881228d5c0b7d756b8..befbb2e662b6d133d41a599909bd70433119933d 100644 (file)
@@ -54,6 +54,13 @@ ec_node_option_complete(const struct ec_node *gen_node,
        return ec_node_complete_child(node->child, comp, strvec);
 }
 
+static void ec_node_option_free_priv(struct ec_node *gen_node)
+{
+       struct ec_node_option *node = (struct ec_node_option *)gen_node;
+
+       ec_node_free(node->child);
+}
+
 static size_t
 ec_node_option_get_children_count(const struct ec_node *gen_node)
 {
@@ -80,6 +87,7 @@ static struct ec_node_type ec_node_option_type = {
        .parse = ec_node_option_parse,
        .complete = ec_node_option_complete,
        .size = sizeof(struct ec_node_option),
+       .free_priv = ec_node_option_free_priv,
        .get_children_count = ec_node_option_get_children_count,
        .get_child = ec_node_option_get_child,
 };
index 67047b37681285f2d4ee93913ea02b5c008d8b78..b36cbd7e29b259d5cff1dd8b619bb1f1da90d262 100644 (file)
@@ -68,7 +68,10 @@ ec_node_or_complete(const struct ec_node *gen_node,
 static void ec_node_or_free_priv(struct ec_node *gen_node)
 {
        struct ec_node_or *node = (struct ec_node_or *)gen_node;
+       size_t i;
 
+       for (i = 0; i < node->len; i++)
+               ec_node_free(node->table[i]);
        ec_free(node->table);
 }
 
index 79a75eb591a0fe8e04c3acc25db0a899b74e0012..4f0f8d39bc404de858aca1bf57ac72431a20c64d 100644 (file)
@@ -143,6 +143,7 @@ static void ec_node_re_lex_free_priv(struct ec_node *gen_node)
        struct ec_node_re_lex *node = (struct ec_node_re_lex *)gen_node;
        unsigned int i;
 
+       ec_node_free(node->child);
        for (i = 0; i < node->len; i++) {
                ec_free(node->table[i].pattern);
                regfree(&node->table[i].r);
index 92dc73e413d6cf0782397c3b730eb7912c91a6ae..be03f313bbd659a1eb3f7af6e26f30ec3c555b08 100644 (file)
@@ -158,7 +158,10 @@ ec_node_seq_complete(const struct ec_node *gen_node,
 static void ec_node_seq_free_priv(struct ec_node *gen_node)
 {
        struct ec_node_seq *node = (struct ec_node_seq *)gen_node;
+       size_t i;
 
+       for (i = 0; i < node->len; i++)
+               ec_node_free(node->table[i]);
        ec_free(node->table);
 }
 
index a0b7a055f4401f2ca8bd1d887d52523455a78054..b39ce213e580c725e3b6b7f94aa3777545f58e0d 100644 (file)
@@ -336,6 +336,13 @@ ec_node_sh_lex_complete(const struct ec_node *gen_node,
        return -1;
 }
 
+static void ec_node_sh_lex_free_priv(struct ec_node *gen_node)
+{
+       struct ec_node_sh_lex *node = (struct ec_node_sh_lex *)gen_node;
+
+       ec_node_free(node->child);
+}
+
 static size_t
 ec_node_sh_lex_get_children_count(const struct ec_node *gen_node)
 {
@@ -362,6 +369,7 @@ static struct ec_node_type ec_node_sh_lex_type = {
        .parse = ec_node_sh_lex_parse,
        .complete = ec_node_sh_lex_complete,
        .size = sizeof(struct ec_node_sh_lex),
+       .free_priv = ec_node_sh_lex_free_priv,
        .get_children_count = ec_node_sh_lex_get_children_count,
        .get_child = ec_node_sh_lex_get_child,
 };
index 1afbde7e4ce5865abdb6a47e1bad8bb9012d312a..059b7b97197e7c0fd4b3617fd294027b4297d3b4 100644 (file)
@@ -234,7 +234,10 @@ ec_node_subset_complete(const struct ec_node *gen_node,
 static void ec_node_subset_free_priv(struct ec_node *gen_node)
 {
        struct ec_node_subset *node = (struct ec_node_subset *)gen_node;
+       size_t i;
 
+       for (i = 0; i < node->len; i++)
+               ec_node_free(node->table[i]);
        ec_free(node->table);
 }