q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=0b2c070b0634bdf5e171423c6fb56fd671ddcc85
commit 0b2c070b0634bdf5e171423c6fb56fd671ddcc85 Author: Daniel Kolesa <d.kol...@osg.samsung.com> Date: Mon Jan 2 14:35:17 2017 +0100 eolian: partially clean up implement filling logic --- src/lib/eolian/database_fill.c | 97 +++++++++++++++++++----------------------- src/lib/eolian/eo_parser.c | 7 +-- 2 files changed, 47 insertions(+), 57 deletions(-) diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c index 14c79cb..743419d 100644 --- a/src/lib/eolian/database_fill.c +++ b/src/lib/eolian/database_fill.c @@ -7,44 +7,52 @@ static Eina_Bool _func_error(Eolian_Class *cl, Eolian_Implement *impl) { - fprintf(stderr, "eolian:%s:%d:%d: '%s%s' not known in class '%s'\n", + fprintf(stderr, "eolian:%s:%d:%d: '%s' not known in class '%s'\n", impl->base.file, impl->base.line, impl->base.column, impl->full_name, - (impl->is_prop_get ? ".get" : (impl->is_prop_set ? ".set" : "")), eolian_class_name_get(cl)); return EINA_FALSE; } static Eina_Bool -_get_impl_func(Eolian_Class *cl, Eolian_Implement *impl, +_get_impl_func(Eolian_Class *cl EINA_UNUSED, Eolian_Implement *impl, Eolian_Function_Type ftype, Eolian_Function **foo_id) { - size_t cllen = strlen(cl->full_name); size_t imlen = strlen(impl->full_name); - const char *imstr = impl->full_name; - *foo_id = NULL; - if (imstr[0] == '.') - ++imstr; - else if ((imlen > (cllen + 1)) && (*(imstr + cllen) == '.') - && !strncmp(imstr, cl->full_name, cllen)) - imstr += cllen + 1; - else - return EINA_TRUE; - if (strchr(imstr, '.')) - return EINA_TRUE; - impl->klass = cl; - *foo_id = (Eolian_Function*)eolian_class_function_get_by_name(cl, imstr, - ftype); - impl->foo_id = *foo_id; - return !!*foo_id; + char *clbuf = alloca(imlen + 1); + memcpy(clbuf, impl->full_name, imlen + 1); + + char *ldot = strrchr(clbuf, '.'); + if (!ldot) + return EINA_FALSE; /* unreachable in practice, for static analysis */ + + *ldot = '\0'; /* split between class name and func name */ + const char *clname = clbuf; + const char *fnname = ldot + 1; + + const Eolian_Class *tcl = eolian_class_get_by_name(clname); + if (!tcl) + return EINA_FALSE; + + impl->klass = tcl; + + const Eolian_Function *fid = eolian_class_function_get_by_name(tcl, fnname, ftype); + if (!fid) + return EINA_FALSE; + + *foo_id = (Eolian_Function *)fid; + impl->foo_id = fid; + + return EINA_TRUE; } static void -_write_impl(Eolian_Function *fid, Eolian_Implement *impl) +_write_impl(Eolian_Function *fid, Eolian_Function_Type ftype, + Eolian_Implement *impl) { - if (impl->is_prop_set) - fid->set_impl = impl; - else if (impl->is_prop_get) + if (ftype == EOLIAN_PROP_GET) fid->get_impl = impl; + else if (ftype == EOLIAN_PROP_SET) + fid->set_impl = impl; else fid->get_impl = fid->set_impl = impl; } @@ -52,12 +60,12 @@ _write_impl(Eolian_Function *fid, Eolian_Implement *impl) static Eina_Bool _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl) { - const char *impl_name = impl->full_name; - Eolian_Function *foo_id; Eolian_Function_Type ftype = EOLIAN_UNRESOLVED; - if (impl->is_prop_get) + if (impl->is_prop_get && impl->is_prop_set) + ftype = EOLIAN_PROPERTY; + else if (impl->is_prop_get) ftype = EOLIAN_PROP_GET; else if (impl->is_prop_set) ftype = EOLIAN_PROP_SET; @@ -66,47 +74,28 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl) { if (!_get_impl_func(cl, impl, ftype, &foo_id)) return _func_error(cl, impl); - if (!foo_id) - goto pasttags; - if (impl->is_prop_set) - foo_id->set_auto = EINA_TRUE; - else - foo_id->get_auto = EINA_TRUE; - - _write_impl(foo_id, impl); + foo_id->get_auto = impl->is_prop_get; + foo_id->set_auto = impl->is_prop_set; + _write_impl(foo_id, ftype, impl); } else if (impl->is_empty) { if (!_get_impl_func(cl, impl, ftype, &foo_id)) return _func_error(cl, impl); - if (!foo_id) - goto pasttags; - if (impl->is_prop_set) - foo_id->set_empty = EINA_TRUE; - else - foo_id->get_empty = EINA_TRUE; - - _write_impl(foo_id, impl); + foo_id->get_empty = impl->is_prop_get; + foo_id->set_empty = impl->is_prop_set; + _write_impl(foo_id, ftype, impl); } else if (!_get_impl_func(cl, impl, ftype, &foo_id)) return _func_error(cl, impl); if (foo_id && foo_id->klass == cl && eolian_function_is_virtual_pure(foo_id, ftype)) { - fprintf(stderr, "eolian:%s:%d:%d: impl of pure virtual '%s%s'\n", - impl->base.file, impl->base.line, impl->base.column, impl->full_name, - (impl->is_prop_get ? ".get" : (impl->is_prop_set ? ".set" : ""))); + fprintf(stderr, "eolian:%s:%d:%d: impl of pure virtual '%s'\n", + impl->base.file, impl->base.line, impl->base.column, impl->full_name); return EINA_FALSE; } -pasttags: - if (impl_name[0] == '.') - { - impl->full_name = eina_stringshare_printf("%s%s", cl->full_name, - impl_name); - eina_stringshare_del(impl_name); - } - return EINA_TRUE; } diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index d864791..8764c06 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -1536,15 +1536,16 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface) if (ls->t.token == '.') { if (!impl->is_auto && !impl->is_empty) - goto fullclass; + eo_lexer_syntax_error(ls, "class name expected"); check_next(ls, '.'); if (ls->t.token != TOK_VALUE) eo_lexer_syntax_error(ls, "name expected"); - impl->full_name = eina_stringshare_printf(".%s", ls->t.value.s); + impl->full_name = eina_stringshare_printf("%s.%s", + ls->tmp.kls->full_name, + ls->t.value.s); eo_lexer_get(ls); goto propbeg; } -fullclass: if (ls->t.token != TOK_VALUE) eo_lexer_syntax_error(ls, "class name expected"); buf = push_strbuf(ls); --