From: Daniel Kolesa Date: Wed, 31 Jan 2018 17:06:17 +0000 (+0100) Subject: eolian: all dependency parsing is now deferred X-Git-Tag: upstream/1.21.0~2090 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b4ff59e1896eceb6801139c0c147637d9284a828;p=platform%2Fupstream%2Fefl.git eolian: all dependency parsing is now deferred --- diff --git a/src/lib/eolian/database_part.c b/src/lib/eolian/database_part.c index dca036a..853eead 100644 --- a/src/lib/eolian/database_part.c +++ b/src/lib/eolian/database_part.c @@ -9,7 +9,9 @@ void database_part_del(Eolian_Part *part) { if (!part) return; - if (part->name) eina_stringshare_del(part->name); + eina_stringshare_del(part->name); + if (!part->base.validated) + eina_stringshare_del(part->klass_name); database_doc_del(part->doc); free(part); } diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index 66cf97f..1a4c83f 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -415,6 +415,19 @@ _validate_part(const Eolian_Unit *src, Eolian_Part *part, Eina_Hash *nhash) if (!_validate_doc(src, part->doc)) return EINA_FALSE; + /* switch the class name for class */ + Eolian_Class *pcl = eina_hash_find(src->state->unit.classes, part->klass_name); + if (!pcl) + { + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "unknown part class '%s' (incorrect case?)", + part->klass_name); + _obj_error(&part->base, buf); + return EINA_FALSE; + } + eina_stringshare_del(part->klass_name); + part->klass = pcl; + return _validate(&part->base); } diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index f7445bf..3441ad4 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -677,22 +677,6 @@ parse_struct_attrs(Eo_Lexer *ls, Eina_Bool is_enum, Eina_Bool *is_extern, } } -static Eolian_Class * -_parse_dep(Eo_Lexer *ls, const char *fname, const char *name) -{ - if (eina_hash_find(ls->state->parsing, fname)) - return NULL; - Eolian_Class *cl = NULL; - if (!eo_parser_database_fill(ls->unit, fname, EINA_FALSE, &cl) || !cl) - { - char buf[PATH_MAX]; - eo_lexer_context_restore(ls); - snprintf(buf, sizeof(buf), "error parsing dependency '%s'", name); - eo_lexer_syntax_error(ls, buf); - } - return cl; -} - static Eolian_Type * parse_type_void(Eo_Lexer *ls) { @@ -1525,28 +1509,20 @@ parse_part(Eo_Lexer *ls) eo_lexer_context_push(ls); parse_name(ls, buf); const char *nm = eina_strbuf_string_get(buf); - const char *bnm = eina_stringshare_ref(ls->filename); char *fnm = database_class_to_filename(nm); - if (!compare_class_file(bnm, fnm)) + const char *fname = eina_hash_find(ls->state->filenames_eo, fnm); + if (!fname) { - Eolian_Class *dep = NULL; - const char *fname = eina_hash_find(ls->state->filenames_eo, fnm); - eina_stringshare_del(bnm); free(fnm); - if (fname) - dep = _parse_dep(ls, fname, nm); - if (!dep) - { - char ebuf[PATH_MAX]; - eo_lexer_context_restore(ls); - snprintf(ebuf, sizeof(ebuf), "unknown class '%s'", nm); - eo_lexer_syntax_error(ls, ebuf); - return; - } - part->klass = dep; + char ebuf[PATH_MAX]; + eo_lexer_context_restore(ls); + snprintf(ebuf, sizeof(ebuf), "unknown class '%s'", nm); + eo_lexer_syntax_error(ls, ebuf); + return; } - else - part->klass = ls->tmp.kls; + eina_hash_set(ls->state->defer, fnm, fname); + free(fnm); + part->klass_name = eina_stringshare_add(nm); pop_strbuf(ls); check_next(ls, ';'); FILL_DOC(ls, part, doc); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index d6393a9..69bd563 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -168,7 +168,12 @@ struct _Eolian_Part { Eolian_Object base; Eina_Stringshare *name; - Eolian_Class *klass; + /* when not validated, class name is stored */ + union + { + Eina_Stringshare *klass_name; + Eolian_Class *klass; + }; Eolian_Documentation *doc; };