From e75ded5e3fd28a9a5f450a22dbb279f2b723d61d Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 4 Sep 2014 14:29:33 +0100 Subject: [PATCH] eolian: prepare for implements list expansion As the implements list will soon contain all methods and properties, do some preparations. The Eolian library now fills in class field in implements early on when the implement is local. The Eolian C generator now checks for local implements and skips them (so that things don't break). --- src/bin/eolian/eo_generator.c | 2 ++ src/bin/eolian/impl_generator.c | 3 +++ src/lib/eolian/database_fill.c | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/src/bin/eolian/eo_generator.c b/src/bin/eolian/eo_generator.c index ce1d0ad52c..20f69a0b19 100644 --- a/src/bin/eolian/eo_generator.c +++ b/src/bin/eolian/eo_generator.c @@ -726,6 +726,8 @@ eo_source_end_generate(const Eolian_Class *class, Eina_Strbuf *buf) if ((impl_class = eolian_implement_class_get(impl_desc))) { + if (impl_class == class) + continue; fnid = eolian_implement_function_get(impl_desc, &ftype); _class_env_create(impl_class, NULL, &impl_env); funcname = eolian_function_name_get(fnid); diff --git a/src/bin/eolian/impl_generator.c b/src/bin/eolian/impl_generator.c index c91ca42d56..645982d3c4 100644 --- a/src/bin/eolian/impl_generator.c +++ b/src/bin/eolian/impl_generator.c @@ -280,6 +280,9 @@ impl_source_generate(const Eolian_Class *class, Eina_Strbuf *buffer) EINA_ITERATOR_FOREACH(itr, impl_desc) { Eolian_Function_Type ftype; + const Eolian_Class *cl = eolian_implement_class_get(impl_desc); + if (cl == class) + continue; if (!(foo = eolian_implement_function_get(impl_desc, &ftype))) { const char *name = names[eolian_implement_is_prop_get(impl_desc) diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c index 4fba89b6d1..555016ba05 100644 --- a/src/lib/eolian/database_fill.c +++ b/src/lib/eolian/database_fill.c @@ -250,6 +250,7 @@ _get_impl_func(Eolian_Class *cl, Eolian_Implement *impl, return EINA_TRUE; if (strchr(imstr, '.')) return EINA_FALSE; + impl->klass = cl; *foo_id = (Eolian_Function*)eolian_class_function_get_by_name(cl, imstr, ftype); return !!*foo_id; @@ -314,6 +315,12 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl) cl->class_dtor_enable = EINA_TRUE; return 1; } + else + { + Eolian_Function *foo_id; + if (!_get_impl_func(cl, impl, ftype, &foo_id)) + return _func_error(cl, impl); + } pasttags: if (impl_name[0] == '.')