summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2018-02-23 15:14:13 +0100
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2018-02-23 15:25:55 +0100
commit1a7dabeb74fa6a039b431b0e8442f43ead15282e (patch)
treed1faeaa67c8ca32389892e6e8bdc56fb17162c68
parent411e140eaf9f51b9018e089d42ec1c8a8b5419ed (diff)
downloadefl-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.c6
-rw-r--r--src/lib/eolian/database_var.c28
-rw-r--r--src/lib/eolian/eo_parser.c4
-rw-r--r--src/lib/eolian/eolian_database.c22
-rw-r--r--src/lib/eolian/eolian_database.h5
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);