eolian: introduce main and staging areas properly
authorDaniel Kolesa <d.kolesa@osg.samsung.com>
Thu, 22 Mar 2018 16:05:26 +0000 (17:05 +0100)
committerWonki Kim <wonki_.kim@samsung.com>
Tue, 10 Apr 2018 11:22:02 +0000 (20:22 +0900)
The state is now correctly divided. No merging is performed yet,
which is to be done next.

src/lib/eolian/database_type.c
src/lib/eolian/database_var.c
src/lib/eolian/eo_lexer.c
src/lib/eolian/eo_parser.c
src/lib/eolian/eolian_database.c
src/lib/eolian/eolian_database.h

index 28626fd..ffdf5eb 100644 (file)
@@ -36,8 +36,8 @@ void
 database_type_add(Eolian_Unit *unit, Eolian_Typedecl *tp)
 {
    EOLIAN_OBJECT_ADD(unit, tp->base.name, tp, aliases);
-   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),
+   eina_hash_set(unit->state->main.aliases_f, tp->base.file, eina_list_append
+                ((Eina_List*)eina_hash_find(unit->state->main.aliases_f, tp->base.file),
                 tp));
    database_object_add(unit, &tp->base);
 }
@@ -46,8 +46,8 @@ void
 database_struct_add(Eolian_Unit *unit, Eolian_Typedecl *tp)
 {
    EOLIAN_OBJECT_ADD(unit, tp->base.name, tp, 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));
+   eina_hash_set(unit->state->main.structs_f, tp->base.file, eina_list_append
+                ((Eina_List*)eina_hash_find(unit->state->main.structs_f, tp->base.file), tp));
    database_object_add(unit, &tp->base);
 }
 
@@ -55,8 +55,8 @@ void
 database_enum_add(Eolian_Unit *unit, Eolian_Typedecl *tp)
 {
    EOLIAN_OBJECT_ADD(unit, tp->base.name, tp, 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));
+   eina_hash_set(unit->state->main.enums_f, tp->base.file, eina_list_append
+                ((Eina_List*)eina_hash_find(unit->state->main.enums_f, tp->base.file), tp));
    database_object_add(unit, &tp->base);
 }
 
index 8196c3c..c14859b 100644 (file)
@@ -22,16 +22,16 @@ static void
 database_var_global_add(Eolian_Unit *unit, Eolian_Variable *var)
 {
    EOLIAN_OBJECT_ADD(unit, var->base.name, var, 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));
+   eina_hash_set(unit->state->main.globals_f, var->base.file, eina_list_append
+                 ((Eina_List*)eina_hash_find(unit->state->main.globals_f, var->base.file), var));
 }
 
 static void
 database_var_constant_add(Eolian_Unit *unit, Eolian_Variable *var)
 {
    EOLIAN_OBJECT_ADD(unit, var->base.name, var, 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));
+   eina_hash_set(unit->state->main.constants_f, var->base.file, eina_list_append
+                 ((Eina_List*)eina_hash_find(unit->state->main.constants_f, var->base.file), var));
 }
 
 void
index 8e9d9fa..d4e6815 100644 (file)
@@ -1089,7 +1089,7 @@ eo_lexer_set_input(Eo_Lexer *ls, Eolian_State *state, const char *source)
      }
    ls->unit = ncunit;
    database_unit_init(state, ncunit, ls->filename);
-   eina_hash_add(state->units, ls->filename, ncunit);
+   eina_hash_add(state->main.units, ls->filename, ncunit);
 
    if (ls->current != 0xEF)
      return;
index 6f87fcd..0c92288 100644 (file)
@@ -108,9 +108,9 @@ compare_class_file(const char *fn1, const char *fn2)
 static Eolian_Object *
 _eolian_decl_get(Eo_Lexer *ls, const char *name)
 {
-   Eolian_Object *obj = eina_hash_find(ls->state->unit.objects, name);
+   Eolian_Object *obj = eina_hash_find(ls->state->main.unit.objects, name);
    if (!obj)
-     obj = eina_hash_find(ls->state->staging.objects, name);
+     obj = eina_hash_find(ls->state->staging.unit.objects, name);
    if (obj && ((obj->type == EOLIAN_OBJECT_CLASS) ||
                (obj->type == EOLIAN_OBJECT_TYPEDECL) ||
                (obj->type == EOLIAN_OBJECT_VARIABLE)))
@@ -2206,7 +2206,7 @@ eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot
    else
      fname = eina_stringshare_add(filename);
 
-   Eolian_Unit *ret = eina_hash_find(parent->state->units, fname);
+   Eolian_Unit *ret = eina_hash_find(parent->state->main.units, fname);
 
    if (ret)
      {
@@ -2241,7 +2241,7 @@ eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot
      }
    ls->klass = NULL;
    EOLIAN_OBJECT_ADD(ls->unit, cl->base.name, cl, classes);
-   eina_hash_set(ls->state->classes_f, cl->base.file, cl);
+   eina_hash_set(ls->state->main.classes_f, cl->base.file, cl);
    eo_lexer_node_release(ls, &cl->base);
 
 done:
index afa524f..47754e7 100644 (file)
@@ -13,9 +13,9 @@ database_object_add(Eolian_Unit *unit, const Eolian_Object *obj)
 {
    /* object storage */
    eina_hash_add(unit->objects, obj->name, obj);
-   eina_hash_add(unit->state->staging.objects, obj->name, obj);
-   eina_hash_set(unit->state->objects_f, obj->file, eina_list_append
-                 ((Eina_List *)eina_hash_find(unit->state->objects_f, obj->file), obj));
+   eina_hash_add(unit->state->staging.unit.objects, obj->name, obj);
+   eina_hash_set(unit->state->main.objects_f, obj->file, eina_list_append
+                 ((Eina_List *)eina_hash_find(unit->state->main.objects_f, obj->file), obj));
 }
 
 EAPI Eolian_Object_Type
@@ -566,9 +566,36 @@ database_unit_del(Eolian_Unit *unit)
 }
 
 static void
-_hashlist_free(void *data)
+_state_area_init(Eolian_State *state, Eolian_State_Area *a, Eina_Bool owned)
 {
-   eina_list_free((Eina_List*)data);
+   database_unit_init(state, &a->unit, NULL);
+
+   a->units = eina_hash_stringshared_new(
+     owned ? EINA_FREE_CB(database_unit_del) : NULL);
+
+   a->classes_f   = eina_hash_stringshared_new(NULL);
+   a->aliases_f   = eina_hash_stringshared_new(EINA_FREE_CB(eina_list_free));
+   a->structs_f   = eina_hash_stringshared_new(EINA_FREE_CB(eina_list_free));
+   a->enums_f     = eina_hash_stringshared_new(EINA_FREE_CB(eina_list_free));
+   a->globals_f   = eina_hash_stringshared_new(EINA_FREE_CB(eina_list_free));
+   a->constants_f = eina_hash_stringshared_new(EINA_FREE_CB(eina_list_free));
+   a->objects_f   = eina_hash_stringshared_new(EINA_FREE_CB(eina_list_free));
+}
+
+static void
+_state_area_contents_del(Eolian_State_Area *a)
+{
+   _unit_contents_del(&a->unit);
+
+   eina_hash_free(a->units);
+
+   eina_hash_free(a->classes_f);
+   eina_hash_free(a->aliases_f);
+   eina_hash_free(a->structs_f);
+   eina_hash_free(a->enums_f);
+   eina_hash_free(a->globals_f);
+   eina_hash_free(a->constants_f);
+   eina_hash_free(a->objects_f);
 }
 
 static void
@@ -604,22 +631,13 @@ eolian_state_new(void)
 
    state->error = _default_error_cb;
 
-   database_unit_init(state, &state->unit, NULL);
-   database_unit_init(state, &state->staging, NULL);
+   _state_area_init(state, &state->main, EINA_TRUE);
+   _state_area_init(state, &state->staging, EINA_FALSE);
 
    state->filenames_eo  = eina_hash_string_small_new(free);
    state->filenames_eot = eina_hash_string_small_new(free);
 
    state->defer = eina_hash_string_small_new(NULL);
-   state->units = eina_hash_stringshared_new(EINA_FREE_CB(database_unit_del));
-
-   state->classes_f   = eina_hash_stringshared_new(NULL);
-   state->aliases_f   = eina_hash_stringshared_new(_hashlist_free);
-   state->structs_f   = eina_hash_stringshared_new(_hashlist_free);
-   state->enums_f     = eina_hash_stringshared_new(_hashlist_free);
-   state->globals_f   = eina_hash_stringshared_new(_hashlist_free);
-   state->constants_f = eina_hash_stringshared_new(_hashlist_free);
-   state->objects_f   = eina_hash_stringshared_new(_hashlist_free);
 
    return state;
 }
@@ -630,22 +648,13 @@ eolian_state_free(Eolian_State *state)
    if (!state)
      return;
 
-   _unit_contents_del(&state->unit);
-   _unit_contents_del(&state->staging);
+   _state_area_contents_del(&state->main);
+   _state_area_contents_del(&state->staging);
 
    eina_hash_free(state->filenames_eo);
    eina_hash_free(state->filenames_eot);
 
    eina_hash_free(state->defer);
-   eina_hash_free(state->units);
-
-   eina_hash_free(state->classes_f);
-   eina_hash_free(state->aliases_f);
-   eina_hash_free(state->structs_f);
-   eina_hash_free(state->enums_f);
-   eina_hash_free(state->globals_f);
-   eina_hash_free(state->constants_f);
-   eina_hash_free(state->objects_f);
 
    free(state);
 }
@@ -779,7 +788,7 @@ _state_clean(Eolian_State *state)
 {
     eina_hash_free_buckets(state->defer);
 
-    Eolian_Unit *st = &state->staging;
+    Eolian_Unit *st = &state->staging.unit;
     eina_hash_free_buckets(st->classes);
     eina_hash_free_buckets(st->globals);
     eina_hash_free_buckets(st->constants);
@@ -895,9 +904,9 @@ eolian_state_file_parse(Eolian_State *state, const char *filepath)
    _merge_units(ret);
    if (!database_validate(ret))
      return NULL;
-   _merge_unit(&state->unit, &state->staging);
+   _merge_unit(&state->main.unit, &state->staging.unit);
    _state_clean(state);
-   return &state->unit;
+   return ret;
 }
 
 typedef struct _Parse_Data
@@ -929,10 +938,10 @@ eolian_state_all_eot_files_parse(Eolian_State *state)
    _state_clean(state);
    eina_hash_foreach(state->filenames_eot, _tfile_parse, &pd);
 
-   if (pd.ret && !database_validate(&state->staging))
+   if (pd.ret && !database_validate(&state->staging.unit))
      return EINA_FALSE;
 
-   _merge_unit(&state->unit, &state->staging);
+   _merge_unit(&state->main.unit, &state->staging.unit);
    _state_clean(state);
 
    return pd.ret;
@@ -961,10 +970,10 @@ eolian_state_all_eo_files_parse(Eolian_State *state)
    _state_clean(state);
    eina_hash_foreach(state->filenames_eo, _file_parse, &pd);
 
-   if (pd.ret && !database_validate(&state->staging))
+   if (pd.ret && !database_validate(&state->staging.unit))
      return EINA_FALSE;
 
-   _merge_unit(&state->unit, &state->staging);
+   _merge_unit(&state->main.unit, &state->staging.unit);
    _state_clean(state);
 
    return pd.ret;
@@ -975,7 +984,7 @@ eolian_state_unit_by_file_get(const Eolian_State *state, const char *file_name)
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eolian_Unit *unit = eina_hash_find(state->units, shr);
+   Eolian_Unit *unit = eina_hash_find(state->main.units, shr);
    eina_stringshare_del(shr);
    return unit;
 }
@@ -984,7 +993,7 @@ EAPI Eina_Iterator *
 eolian_state_units_get(const Eolian_State *state)
 {
    if (!state) return NULL;
-   return eina_hash_iterator_data_new(state->units);
+   return eina_hash_iterator_data_new(state->main.units);
 }
 
 EAPI Eina_Iterator *
@@ -992,7 +1001,7 @@ eolian_state_objects_by_file_get(const Eolian_State *state, const char *file_nam
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eina_List *l = eina_hash_find(state->objects_f, shr);
+   Eina_List *l = eina_hash_find(state->main.objects_f, shr);
    eina_stringshare_del(shr);
    if (!l) return NULL;
    return eina_list_iterator_new(l);
@@ -1003,7 +1012,7 @@ eolian_state_class_by_file_get(const Eolian_State *state, const char *file_name)
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eolian_Class *cl = eina_hash_find(state->classes_f, shr);
+   Eolian_Class *cl = eina_hash_find(state->main.classes_f, shr);
    eina_stringshare_del(shr);
    return cl;
 }
@@ -1013,7 +1022,7 @@ eolian_state_globals_by_file_get(const Eolian_State *state, const char *file_nam
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eina_List *l = eina_hash_find(state->globals_f, shr);
+   Eina_List *l = eina_hash_find(state->main.globals_f, shr);
    eina_stringshare_del(shr);
    if (!l) return NULL;
    return eina_list_iterator_new(l);
@@ -1024,7 +1033,7 @@ eolian_state_constants_by_file_get(const Eolian_State *state, const char *file_n
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eina_List *l = eina_hash_find(state->constants_f, shr);
+   Eina_List *l = eina_hash_find(state->main.constants_f, shr);
    eina_stringshare_del(shr);
    if (!l) return NULL;
    return eina_list_iterator_new(l);
@@ -1035,7 +1044,7 @@ eolian_state_aliases_by_file_get(const Eolian_State *state, const char *file_nam
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eina_List *l = eina_hash_find(state->aliases_f, shr);
+   Eina_List *l = eina_hash_find(state->main.aliases_f, shr);
    eina_stringshare_del(shr);
    if (!l) return NULL;
    return eina_list_iterator_new(l);
@@ -1046,7 +1055,7 @@ eolian_state_structs_by_file_get(const Eolian_State *state, const char *file_nam
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eina_List *l = eina_hash_find(state->structs_f, shr);
+   Eina_List *l = eina_hash_find(state->main.structs_f, shr);
    eina_stringshare_del(shr);
    if (!l) return NULL;
    return eina_list_iterator_new(l);
@@ -1057,7 +1066,7 @@ eolian_state_enums_by_file_get(const Eolian_State *state, const char *file_name)
 {
    if (!state) return NULL;
    Eina_Stringshare *shr = eina_stringshare_add(file_name);
-   Eina_List *l = eina_hash_find(state->enums_f, shr);
+   Eina_List *l = eina_hash_find(state->main.enums_f, shr);
    eina_stringshare_del(shr);
    if (!l) return NULL;
    return eina_list_iterator_new(l);
index a359cdd..4df6b26 100644 (file)
@@ -47,10 +47,25 @@ struct _Eolian_Unit
    Eina_Hash     *objects;
 };
 
-struct _Eolian_State
+typedef struct _Eolian_State_Area
 {
    Eolian_Unit unit;
-   Eolian_Unit staging;
+
+   Eina_Hash *units;
+
+   Eina_Hash *classes_f;
+   Eina_Hash *aliases_f;
+   Eina_Hash *structs_f;
+   Eina_Hash *enums_f;
+   Eina_Hash *globals_f;
+   Eina_Hash *constants_f;
+   Eina_Hash *objects_f;
+} Eolian_State_Area;
+
+struct _Eolian_State
+{
+   Eolian_State_Area main;
+   Eolian_State_Area staging;
 
    Eolian_Panic_Cb panic;
    Eina_Stringshare *panic_msg;
@@ -63,15 +78,6 @@ struct _Eolian_State
    Eina_Hash *filenames_eot;
 
    Eina_Hash *defer;
-   Eina_Hash *units;
-
-   Eina_Hash *classes_f;
-   Eina_Hash *aliases_f;
-   Eina_Hash *structs_f;
-   Eina_Hash *enums_f;
-   Eina_Hash *globals_f;
-   Eina_Hash *constants_f;
-   Eina_Hash *objects_f;
 };
 
 struct _Eolian_Object
@@ -107,7 +113,7 @@ eolian_object_add(Eolian_Object *obj, Eina_Stringshare *name, Eina_Hash *hash)
 
 #define EOLIAN_OBJECT_ADD(tunit, name, obj, memb) \
 { \
-   eolian_object_add(&obj->base, name, tunit->state->staging.memb); \
+   eolian_object_add(&obj->base, name, tunit->state->staging.unit.memb); \
    eolian_object_add(&obj->base, name, tunit->memb); \
 }