diff options
author | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2018-02-23 15:14:13 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@osg.samsung.com> | 2018-02-23 15:25:55 +0100 |
commit | 1a7dabeb74fa6a039b431b0e8442f43ead15282e (patch) | |
tree | d1faeaa67c8ca32389892e6e8bdc56fb17162c68 | |
parent | 411e140eaf9f51b9018e089d42ec1c8a8b5419ed (diff) | |
download | efl-1a7dabeb74fa6a039b431b0e8442f43ead15282e.tar.gz |
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.
-rw-r--r-- | src/lib/eolian/database_type.c | 6 | ||||
-rw-r--r-- | src/lib/eolian/database_var.c | 28 | ||||
-rw-r--r-- | src/lib/eolian/eo_parser.c | 4 | ||||
-rw-r--r-- | src/lib/eolian/eolian_database.c | 22 | ||||
-rw-r--r-- | 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); |