eolian: make inherits_get return a list of classes, not strings

Most of the time you need to retrieve the class from the string
anyway, so remove this relic of old Eolian and gain some small
performance benefits and extra convenience.

Subtly breaks API but everything should be updated.
This commit is contained in:
Daniel Kolesa 2017-10-25 16:23:57 +02:00
parent a4c96ceb73
commit 4f8a9b50f4
12 changed files with 27 additions and 35 deletions

View File

@ -965,14 +965,13 @@ eo_gen_source_gen(const Eolian_Unit *src,
/* inherits in EFL_DEFINE_CLASS */ /* inherits in EFL_DEFINE_CLASS */
{ {
const char *iname; const Eolian_Class *icl;
Eina_Iterator *itr = eolian_class_inherits_get(cl); Eina_Iterator *itr = eolian_class_inherits_get(cl);
/* no inherits, NULL parent */ /* no inherits, NULL parent */
if (!itr) if (!itr)
eina_strbuf_append(buf, ", NULL"); eina_strbuf_append(buf, ", NULL");
EINA_ITERATOR_FOREACH(itr, iname) EINA_ITERATOR_FOREACH(itr, icl)
{ {
const Eolian_Class *icl = eolian_class_get_by_name(src, iname);
Eina_Stringshare *mname = eolian_class_c_name_get(icl); Eina_Stringshare *mname = eolian_class_c_name_get(icl);
eina_strbuf_append_printf(buf, ", %s", mname); eina_strbuf_append_printf(buf, ", %s", mname);
eina_stringshare_del(mname); eina_stringshare_del(mname);

View File

@ -114,10 +114,10 @@ generate(const Eolian_Class* klass, eolian_cxx::options_type const& opts)
std::function<void(Eolian_Class const*)> klass_function std::function<void(Eolian_Class const*)> klass_function
= [&] (Eolian_Class const* klass) = [&] (Eolian_Class const* klass)
{ {
for(efl::eina::iterator<const char> inherit_iterator ( ::eolian_class_inherits_get(klass)) for(efl::eina::iterator<Eolian_Class const> inherit_iterator ( ::eolian_class_inherits_get(klass))
, inherit_last; inherit_iterator != inherit_last; ++inherit_iterator) , inherit_last; inherit_iterator != inherit_last; ++inherit_iterator)
{ {
Eolian_Class const* inherit = ::eolian_class_get_by_name(opts.unit, &*inherit_iterator); Eolian_Class const* inherit = &*inherit_iterator;
c_headers.insert(eolian_class_file_get(inherit) + std::string(".h")); c_headers.insert(eolian_class_file_get(inherit) + std::string(".h"));
cpp_headers.insert(eolian_class_file_get(inherit) + std::string(".hh")); cpp_headers.insert(eolian_class_file_get(inherit) + std::string(".hh"));
efl::eolian::grammar::attributes::klass_def klass{inherit, opts.unit}; efl::eolian::grammar::attributes::klass_def klass{inherit, opts.unit};

View File

@ -1239,7 +1239,7 @@ M.Class = ffi.metatype("Eolian_Class", {
end, end,
inherits_get = function(self) inherits_get = function(self)
return iterator.String_Iterator( return Ptr_Iterator("const Eolian_Class*",
eolian.eolian_class_inherits_get(self)) eolian.eolian_class_inherits_get(self))
end, end,

View File

@ -709,7 +709,7 @@ EAPI Eina_Stringshare* eolian_class_event_prefix_get(const Eolian_Class *klass);
EAPI Eina_Stringshare *eolian_class_data_type_get(const Eolian_Class *klass); EAPI Eina_Stringshare *eolian_class_data_type_get(const Eolian_Class *klass);
/* /*
* @brief Returns an iterator to the names of inherit classes of a class * @brief Returns an iterator to the inherited classes.
* *
* @param[in] klass the class * @param[in] klass the class
* @return the iterator * @return the iterator

View File

@ -18,9 +18,6 @@ database_class_del(Eolian_Class *cl)
if (cl->base.file) eina_stringshare_del(cl->base.file); if (cl->base.file) eina_stringshare_del(cl->base.file);
EINA_LIST_FREE(cl->inherits, s)
if (s) eina_stringshare_del(s);
EINA_LIST_FREE(cl->implements, impl) EINA_LIST_FREE(cl->implements, impl)
database_implement_del(impl); database_implement_del(impl);

View File

@ -373,7 +373,7 @@ _validate_class(Eolian_Class *cl, Eina_Hash *nhash)
Eolian_Function *func; Eolian_Function *func;
Eolian_Event *event; Eolian_Event *event;
Eolian_Implement *impl; Eolian_Implement *impl;
const char *iname; Eolian_Class *icl;
Eina_Bool res = EINA_TRUE; Eina_Bool res = EINA_TRUE;
if (!cl) if (!cl)
@ -386,9 +386,9 @@ _validate_class(Eolian_Class *cl, Eina_Hash *nhash)
if (ahash) if (ahash)
nhash = eina_hash_string_small_new(NULL); nhash = eina_hash_string_small_new(NULL);
EINA_LIST_FOREACH(cl->inherits, l, iname) EINA_LIST_FOREACH(cl->inherits, l, icl)
{ {
if (!(res = _validate_class(eina_hash_find(_classes, iname), nhash))) if (!(res = _validate_class(icl, nhash)))
goto freehash; goto freehash;
} }

View File

@ -2021,8 +2021,7 @@ _inherit_dep(Eo_Lexer *ls, Eina_Strbuf *buf, Eina_Bool check_inherit,
default: default:
break; break;
} }
ls->tmp.kls->inherits = eina_list_append(ls->tmp.kls->inherits, ls->tmp.kls->inherits = eina_list_append(ls->tmp.kls->inherits, dep);
eina_stringshare_add(iname));
dep->toplevel = EINA_FALSE; dep->toplevel = EINA_FALSE;
eo_lexer_context_pop(ls); eo_lexer_context_pop(ls);
} }
@ -2245,14 +2244,13 @@ _get_impl_class(const Eolian_Class *cl, const char *cln)
if (!cl || !strcmp(cl->full_name, cln)) if (!cl || !strcmp(cl->full_name, cln))
return cl; return cl;
Eina_List *l; Eina_List *l;
const char *s; Eolian_Class *icl;
EINA_LIST_FOREACH(cl->inherits, l, s) EINA_LIST_FOREACH(cl->inherits, l, icl)
{ {
/* we can do a depth first search, it's easier and doesn't matter /* we can do a depth first search, it's easier and doesn't matter
* which part of the inheritance tree we find the class in * which part of the inheritance tree we find the class in
*/ */
/* FIXME: pass unit properly */ const Eolian_Class *fcl = _get_impl_class(icl, cln);
const Eolian_Class *fcl = _get_impl_class(eolian_class_get_by_name(NULL, s), cln);
if (fcl) if (fcl)
return fcl; return fcl;
} }

View File

@ -91,7 +91,7 @@ struct _Eolian_Class
Eina_Stringshare *eo_prefix; Eina_Stringshare *eo_prefix;
Eina_Stringshare *ev_prefix; Eina_Stringshare *ev_prefix;
Eina_Stringshare *data_type; Eina_Stringshare *data_type;
Eina_List *inherits; /* List Eina_Stringshare * */ Eina_List *inherits; /* List Eolian_Class * */
Eina_List *properties; /* List prop_name -> Eolian_Function */ Eina_List *properties; /* List prop_name -> Eolian_Function */
Eina_List *methods; /* List meth_name -> Eolian_Function */ Eina_List *methods; /* List meth_name -> Eolian_Function */
Eina_List *implements; /* List implements name -> Eolian_Implement */ Eina_List *implements; /* List implements name -> Eolian_Implement */

View File

@ -687,10 +687,10 @@ struct klass_def
std::function<void(Eolian_Class const*)> inherit_algo = std::function<void(Eolian_Class const*)> inherit_algo =
[&] (Eolian_Class const* klass) [&] (Eolian_Class const* klass)
{ {
for(efl::eina::iterator<const char> inherit_iterator ( ::eolian_class_inherits_get(klass)) for(efl::eina::iterator<Eolian_Class const> inherit_iterator ( ::eolian_class_inherits_get(klass))
, inherit_last; inherit_iterator != inherit_last; ++inherit_iterator) , inherit_last; inherit_iterator != inherit_last; ++inherit_iterator)
{ {
Eolian_Class const* inherit = ::eolian_class_get_by_name(unit, &*inherit_iterator); Eolian_Class const* inherit = &*inherit_iterator;
inherits.insert({inherit, {}}); inherits.insert({inherit, {}});
inherit_algo(inherit); inherit_algo(inherit);
} }

View File

@ -223,9 +223,7 @@ M.Class = Node:clone {
return ret return ret
end end
ret = {} ret = {}
for cln in self.class:inherits_get() do for cl in self.class:inherits_get() do
local cl = self.by_name_get(cln)
assert(cl)
ret[#ret + 1] = cl ret[#ret + 1] = cl
end end
self._cache_inhc = ret self._cache_inhc = ret

View File

@ -670,8 +670,7 @@ local gen_class = function(klass)
local parents = {} local parents = {}
local mixins = {} -- also includes ifaces, they're separated later local mixins = {} -- also includes ifaces, they're separated later
for i = 1, #inherits do for i = 1, #inherits do
local v = inherits[i] local tp = inherits[i]:type_get()
local tp = eolian.class_get_by_name(gen_unit, v):type_get()
if tp == class_type.REGULAR or tp == class_type.ABSTRACT then if tp == class_type.REGULAR or tp == class_type.ABSTRACT then
parents[#parents + 1] = v parents[#parents + 1] = v
elseif tp == class_type.INTERFACE or tp == class_type.MIXIN then elseif tp == class_type.INTERFACE or tp == class_type.MIXIN then

View File

@ -12,11 +12,12 @@
START_TEST(eolian_namespaces) START_TEST(eolian_namespaces)
{ {
const Eolian_Class *class11, *class112, *class21, *class_no, *impl_class; const Eolian_Class *class11, *class112, *class21, *class_no, *impl_class,
*iclass;
const Eolian_Function *fid; const Eolian_Function *fid;
Eina_Iterator *iter; Eina_Iterator *iter;
Eolian_Function_Type func_type; Eolian_Function_Type func_type;
const char *class_name, *val1, *val2; const char *val1, *val2;
const Eolian_Implement *impl; const Eolian_Implement *impl;
const Eolian_Unit *unit; const Eolian_Unit *unit;
void *dummy; void *dummy;
@ -61,12 +62,12 @@ START_TEST(eolian_namespaces)
/* Inherits */ /* Inherits */
fail_if(!(iter = eolian_class_inherits_get(class11))); fail_if(!(iter = eolian_class_inherits_get(class11)));
fail_if(!(eina_iterator_next(iter, (void**)&class_name))); fail_if(!(eina_iterator_next(iter, (void**)&iclass)));
fail_if(eolian_class_get_by_name(unit, class_name) != class112); fail_if(iclass != class112);
fail_if(!(eina_iterator_next(iter, (void**)&class_name))); fail_if(!(eina_iterator_next(iter, (void**)&iclass)));
fail_if(eolian_class_get_by_name(unit, class_name) != class21); fail_if(iclass != class21);
fail_if(!(eina_iterator_next(iter, (void**)&class_name))); fail_if(!(eina_iterator_next(iter, (void**)&iclass)));
fail_if(eolian_class_get_by_name(unit, class_name) != class_no); fail_if(iclass != class_no);
fail_if(eina_iterator_next(iter, &dummy)); fail_if(eina_iterator_next(iter, &dummy));
eina_iterator_free(iter); eina_iterator_free(iter);