forked from enlightenment/efl
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:
parent
411e140eaf
commit
1a7dabeb74
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue