q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=edc73c4c4c9282451149225d4a4f8909f7a41a6a

commit edc73c4c4c9282451149225d4a4f8909f7a41a6a
Author: Daniel Kolesa <[email protected]>
Date:   Thu Mar 15 16:34:08 2018 +0100

    eolian: make sure dtors are always run correctly
---
 src/lib/eolian/eo_lexer.c  |  1 +
 src/lib/eolian/eo_parser.c | 21 +++++++++++++++------
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c
index 9db35a238f..ac64c7b5e5 100644
--- a/src/lib/eolian/eo_lexer.c
+++ b/src/lib/eolian/eo_lexer.c
@@ -1142,6 +1142,7 @@ eo_lexer_dtor_pop(Eo_Lexer *ls)
 {
    Eo_Lexer_Dtor *dt = eina_list_data_get(ls->dtors);
    ls->dtors = eina_list_remove_list(ls->dtors, ls->dtors);
+   dt->free_cb(dt->data);
    free(dt);
 }
 
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 8176e4e413..3b535ddcbc 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -436,8 +436,11 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
    def->base.name = name;
    def->type = EOLIAN_TYPEDECL_STRUCT;
    def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free));
-   def->freefunc = freefunc;
-   eo_lexer_dtor_pop(ls);
+   if (freefunc)
+     {
+        def->freefunc = eina_stringshare_ref(freefunc);
+        eo_lexer_dtor_pop(ls);
+     }
    check_next(ls, '{');
    FILL_DOC(ls, def, doc);
    while (ls->t.token != '}')
@@ -779,8 +782,11 @@ parse_typedef(Eo_Lexer *ls)
    Eina_Strbuf *buf;
    eo_lexer_get(ls);
    parse_struct_attrs(ls, EINA_FALSE, &has_extern, &freefunc);
-   def->freefunc = freefunc;
-   eo_lexer_dtor_pop(ls);
+   if (freefunc)
+     {
+        def->freefunc = eina_stringshare_ref(freefunc);
+        eo_lexer_dtor_pop(ls);
+     }
    def->type = EOLIAN_TYPEDECL_ALIAS;
    def->is_extern = has_extern;
    buf = eina_strbuf_new();
@@ -2141,8 +2147,11 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
                 Eolian_Typedecl *def = eo_lexer_typedecl_new(ls);
                 def->is_extern = has_extern;
                 def->type = EOLIAN_TYPEDECL_STRUCT_OPAQUE;
-                def->freefunc = freefunc;
-                eo_lexer_dtor_pop(ls);
+                if (freefunc)
+                  {
+                     def->freefunc = eina_stringshare_ref(freefunc);
+                     eo_lexer_dtor_pop(ls);
+                  }
                 def->base.name = name;
                 eo_lexer_get(ls);
                 FILL_DOC(ls, def, doc);

-- 


Reply via email to