q66 pushed a commit to branch master.

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

commit 1a7dabeb74fa6a039b431b0e8442f43ead15282e
Author: Daniel Kolesa <d.kol...@osg.samsung.com>
Date:   Fri Feb 23 15:14:13 2018 +0100

    eolian: proper in-unit storage for all declarations
    
    This makes sure variables are stored as well as types within their
    respective units. Also, declarations are now refcounted just like
    any other Eolian object.
---
 src/lib/eolian/database_type.c   |  6 +++---
 src/lib/eolian/database_var.c    | 28 +++++++++++++++-------------
 src/lib/eolian/eo_parser.c       |  4 ++--
 src/lib/eolian/eolian_database.c | 22 +++++++++++++++++-----
 src/lib/eolian/eolian_database.h |  5 +++--
 5 files changed, 40 insertions(+), 25 deletions(-)

diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c
index d8954ec5ae..052a2ea577 100644
--- a/src/lib/eolian/database_type.c
+++ b/src/lib/eolian/database_type.c
@@ -48,7 +48,7 @@ database_type_add(Eolian_Unit *unit, Eolian_Typedecl *tp)
    eina_hash_set(unit->state->aliases_f, tp->base.file, eina_list_append
                 ((Eina_List*)eina_hash_find(unit->state->aliases_f, 
tp->base.file),
                 tp));
-   database_decl_add(unit->state, tp->full_name, EOLIAN_DECL_ALIAS, 
tp->base.file, tp);
+   database_decl_add(unit, tp->full_name, EOLIAN_DECL_ALIAS, tp->base.file, 
tp);
 }
 
 void
@@ -58,7 +58,7 @@ database_struct_add(Eolian_Unit *unit, Eolian_Typedecl *tp)
    eolian_object_add(&tp->base, tp->full_name, unit->structs);
    eina_hash_set(unit->state->structs_f, tp->base.file, eina_list_append
                 ((Eina_List*)eina_hash_find(unit->state->structs_f, 
tp->base.file), tp));
-   database_decl_add(unit->state, tp->full_name, EOLIAN_DECL_STRUCT, 
tp->base.file, tp);
+   database_decl_add(unit, tp->full_name, EOLIAN_DECL_STRUCT, tp->base.file, 
tp);
 }
 
 void
@@ -68,7 +68,7 @@ database_enum_add(Eolian_Unit *unit, Eolian_Typedecl *tp)
    eolian_object_add(&tp->base, tp->full_name, unit->enums);
    eina_hash_set(unit->state->enums_f, tp->base.file, eina_list_append
                 ((Eina_List*)eina_hash_find(unit->state->enums_f, 
tp->base.file), tp));
-   database_decl_add(unit->state, tp->full_name, EOLIAN_DECL_ENUM, 
tp->base.file, tp);
+   database_decl_add(unit, tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp);
 }
 
 Eina_Bool
diff --git a/src/lib/eolian/database_var.c b/src/lib/eolian/database_var.c
index 30ea60a9fd..c33df7261d 100644
--- a/src/lib/eolian/database_var.c
+++ b/src/lib/eolian/database_var.c
@@ -23,28 +23,30 @@ database_var_del(Eolian_Variable *var)
 }
 
 static void
-database_var_global_add(Eolian *state, Eolian_Variable *var)
+database_var_global_add(Eolian_Unit *unit, Eolian_Variable *var)
 {
-   eina_hash_set(state->unit.globals, var->full_name, var);
-   eina_hash_set(state->globals_f, var->base.file, eina_list_append
-                 ((Eina_List*)eina_hash_find(state->globals_f, 
var->base.file), var));
-   database_decl_add(state, var->full_name, EOLIAN_DECL_VAR, var->base.file, 
var);
+   eolian_object_add(&var->base, var->full_name, unit->state->unit.globals);
+   eolian_object_add(&var->base, var->full_name, unit->globals);
+   eina_hash_set(unit->state->globals_f, var->base.file, eina_list_append
+                 ((Eina_List*)eina_hash_find(unit->state->globals_f, 
var->base.file), var));
+   database_decl_add(unit, var->full_name, EOLIAN_DECL_VAR, var->base.file, 
var);
 }
 
 static void
-database_var_constant_add(Eolian *state, Eolian_Variable *var)
+database_var_constant_add(Eolian_Unit *unit, Eolian_Variable *var)
 {
-   eina_hash_set(state->unit.constants, var->full_name, var);
-   eina_hash_set(state->constants_f, var->base.file, eina_list_append
-                 ((Eina_List*)eina_hash_find(state->constants_f, 
var->base.file), var));
-   database_decl_add(state, var->full_name, EOLIAN_DECL_VAR, var->base.file, 
var);
+   eolian_object_add(&var->base, var->full_name, unit->state->unit.constants);
+   eolian_object_add(&var->base, var->full_name, unit->constants);
+   eina_hash_set(unit->state->constants_f, var->base.file, eina_list_append
+                 ((Eina_List*)eina_hash_find(unit->state->constants_f, 
var->base.file), var));
+   database_decl_add(unit, var->full_name, EOLIAN_DECL_VAR, var->base.file, 
var);
 }
 
 void
-database_var_add(Eolian *state, Eolian_Variable *var)
+database_var_add(Eolian_Unit *unit, Eolian_Variable *var)
 {
    if (var->type == EOLIAN_VAR_GLOBAL)
-     database_var_global_add(state, var);
+     database_var_global_add(unit, var);
    else
-     database_var_constant_add(state, var);
+     database_var_constant_add(unit, var);
 }
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 56c6a4bfa3..7d9eaad525 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -2165,7 +2165,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
       case KW_const:
       case KW_var:
         {
-           database_var_add(ls->state, parse_variable(ls, ls->t.kw == KW_var));
+           database_var_add(ls->unit, parse_variable(ls, ls->t.kw == KW_var));
            eolian_object_ref(&ls->tmp.var->base);
            ls->tmp.var = NULL;
            break;
@@ -2226,7 +2226,7 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
      }
    return EINA_FALSE;
 found_class:
-   database_decl_add(ls->state, ls->tmp.kls->full_name, EOLIAN_DECL_CLASS,
+   database_decl_add(ls->unit, ls->tmp.kls->full_name, EOLIAN_DECL_CLASS,
                      ls->tmp.kls->base.file, ls->tmp.kls);
    return EINA_TRUE;
 }
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index 514d4bf63a..e5b816e18f 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -9,17 +9,29 @@
 #include "eolian_priv.h"
 
 void
-database_decl_add(Eolian *state, Eina_Stringshare *name,
+database_decl_add(Eolian_Unit *unit, Eina_Stringshare *name,
                   Eolian_Declaration_Type type,
                   Eina_Stringshare *file, void *ptr)
 {
    Eolian_Declaration *decl = calloc(1, sizeof(Eolian_Declaration));
+   decl->base = *((Eolian_Object *)ptr);
+   decl->base.file = eina_stringshare_ref(decl->base.file);
+   decl->base.refcount = 0;
    decl->type = type;
    decl->name = name;
    decl->data = ptr;
-   eina_hash_set(state->unit.decls, name, decl);
-   eina_hash_set(state->decls_f, file, eina_list_append
-                 ((Eina_List*)eina_hash_find(state->decls_f, file), decl));
+   eolian_object_add(&decl->base, name, unit->state->unit.decls);
+   eolian_object_add(&decl->base, name, unit->decls);
+   eina_hash_set(unit->state->decls_f, file, eina_list_append
+                 ((Eina_List*)eina_hash_find(unit->state->decls_f, file), 
decl));
+}
+
+static void
+database_decl_del(Eolian_Declaration *decl)
+{
+   if (!decl || eolian_object_unref(&decl->base)) return;
+   eina_stringshare_del(decl->base.file);
+   free(decl);
 }
 
 EAPI const Eolian_Declaration *
@@ -514,7 +526,7 @@ database_unit_init(Eolian *state, Eolian_Unit *unit)
    unit->aliases    = 
eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
    unit->structs    = 
eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
    unit->enums      = 
eina_hash_stringshared_new(EINA_FREE_CB(database_typedecl_del));
-   unit->decls      = eina_hash_stringshared_new(free);
+   unit->decls      = 
eina_hash_stringshared_new(EINA_FREE_CB(database_decl_del));
 }
 
 void
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index c8cc6dd0fb..3e87e9c933 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -101,6 +101,7 @@ struct _Eolian_Documentation
 
 struct _Eolian_Declaration
 {
+   Eolian_Object base;
    Eolian_Declaration_Type type;
    Eina_Stringshare *name;
    void *data;
@@ -333,7 +334,7 @@ struct _Eolian_Variable
 char *database_class_to_filename(const char *cname);
 Eina_Bool database_validate(Eolian *state, const Eolian_Unit *src);
 
-void database_decl_add(Eolian *state, Eina_Stringshare *name,
+void database_decl_add(Eolian_Unit *unit, Eina_Stringshare *name,
                        Eolian_Declaration_Type type,
                        Eina_Stringshare *file, void *ptr);
 
@@ -367,7 +368,7 @@ void database_expr_print(Eolian_Expression *expr);
 /* variables */
 
 void database_var_del(Eolian_Variable *var);
-void database_var_add(Eolian *state, Eolian_Variable *var);
+void database_var_add(Eolian_Unit *unit, Eolian_Variable *var);
 
 /* classes */
 void database_class_del(Eolian_Class *cl);

-- 


Reply via email to