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.
This commit is contained in:
Daniel Kolesa 2018-02-23 15:14:13 +01:00
parent 411e140eaf
commit 1a7dabeb74
5 changed files with 40 additions and 25 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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

View File

@ -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);