diff --git a/src/bin/eolian/eo1_generator.c b/src/bin/eolian/eo1_generator.c index d294504038..36cb4fb406 100644 --- a/src/bin/eolian/eo1_generator.c +++ b/src/bin/eolian/eo1_generator.c @@ -369,7 +369,7 @@ eo1_bind_func_generate(const char *classname, Eolian_Function funcid, Eolian_Fun Eina_Bool ret_const = EINA_FALSE; Eina_Bool add_star = EINA_FALSE; - if (!impl_name && eolian_function_is_virtual_pure(funcid)) return EINA_TRUE; + if (!impl_name && eolian_function_is_virtual_pure(funcid, ftype)) return EINA_TRUE; Eina_Strbuf *fbody = eina_strbuf_new(); Eina_Strbuf *va_args = eina_strbuf_new(); Eina_Strbuf *params = eina_strbuf_new(); /* only variables names */ @@ -759,7 +759,7 @@ eo1_source_end_generate(const char *classname, Eina_Strbuf *buf) eina_strbuf_append(str_op, eina_strbuf_string_get(tmpbuf)); free(desc); - if (!eolian_function_is_virtual_pure(fn)) + if (!eolian_function_is_virtual_pure(fn, SET)) eo1_eo_func_desc_generate(classname, NULL, tmpstr, tmpbuf); else eina_strbuf_reset(tmpbuf); @@ -774,7 +774,7 @@ eo1_source_end_generate(const char *classname, Eina_Strbuf *buf) free(desc); eina_strbuf_append(str_op, eina_strbuf_string_get(tmpbuf)); - if (!eolian_function_is_virtual_pure(fn)) + if (!eolian_function_is_virtual_pure(fn, GET)) eo1_eo_func_desc_generate(classname, NULL, tmpstr, tmpbuf); else eina_strbuf_reset(tmpbuf); @@ -792,7 +792,7 @@ eo1_source_end_generate(const char *classname, Eina_Strbuf *buf) free(desc); eina_strbuf_append(str_op, eina_strbuf_string_get(tmpbuf)); - if (!eolian_function_is_virtual_pure(fn)) + if (!eolian_function_is_virtual_pure(fn, METHOD_FUNC)) eo1_eo_func_desc_generate(classname, NULL, funcname, tmpbuf); else eina_strbuf_reset(tmpbuf); diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index 85a7a93be6..d1b3bc4fe3 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -329,7 +329,7 @@ EAPI const char *eolian_function_data_get(Eolian_Function function_id, const cha * * @ingroup Eolian */ -EAPI Eina_Bool eolian_function_is_virtual_pure(Eolian_Function function_id); +EAPI Eina_Bool eolian_function_is_virtual_pure(Eolian_Function function_id, Eolian_Function_Type f_type); /* * @brief Returns a specific description for a function. diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c index aee2ae4b51..cb0923b69b 100644 --- a/src/lib/eolian/eo_lexer.c +++ b/src/lib/eolian/eo_lexer.c @@ -4517,7 +4517,7 @@ eo_tokenizer_database_fill(const char *filename) ERR("Error - %s not known in class %s", class + 9, kls->name); goto end; } - database_function_set_as_virtual_pure(foo_id); + database_function_set_as_virtual_pure(foo_id, ftype); continue; } Eolian_Implement impl_desc = database_implement_new(class, func, ftype); diff --git a/src/lib/eolian/eo_lexer.rl b/src/lib/eolian/eo_lexer.rl index 7720302e4a..0a07db90db 100644 --- a/src/lib/eolian/eo_lexer.rl +++ b/src/lib/eolian/eo_lexer.rl @@ -1490,7 +1490,7 @@ eo_tokenizer_database_fill(const char *filename) ERR("Error - %s not known in class %s", class + 9, kls->name); goto end; } - database_function_set_as_virtual_pure(foo_id); + database_function_set_as_virtual_pure(foo_id, ftype); continue; } Eolian_Implement impl_desc = database_implement_new(class, func, ftype); diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c index a77759d360..90a073fa6b 100644 --- a/src/lib/eolian/eolian_database.c +++ b/src/lib/eolian/eolian_database.c @@ -38,7 +38,8 @@ typedef struct Eolian_Function_Type type; Eina_Hash *data; Eina_Bool obj_is_const :1; /* True if the object has to be const. Useful for a few methods. */ - Eina_Bool virtual_pure :1; + Eina_Bool get_virtual_pure :1; + Eina_Bool set_virtual_pure :1; Eina_Bool get_return_warn_unused :1; /* also used for methods */ Eina_Bool set_return_warn_unused :1; Eina_Bool get_return_own :1; /* also used for methods */ @@ -551,7 +552,7 @@ eolian_class_function_find_by_name(const char *class_name, const char *func_name EINA_LIST_FOREACH(desc->properties, itr, foo_id) { _Function_Id *fid = (_Function_Id *) foo_id; - if (!strcmp(fid->name, func_name) && (f_type == UNRESOLVED || f_type == PROPERTY_FUNC || f_type == fid->type)) + if (!strcmp(fid->name, func_name)) return foo_id; } } @@ -631,20 +632,30 @@ eolian_function_name_get(Eolian_Function function_id) } Eina_Bool -database_function_set_as_virtual_pure(Eolian_Function function_id) +database_function_set_as_virtual_pure(Eolian_Function function_id, Eolian_Function_Type ftype) { _Function_Id *fid = (_Function_Id *)function_id; EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE); - fid->virtual_pure = EINA_TRUE; + switch (ftype) + { + case UNRESOLVED: case METHOD_FUNC: case GET: fid->get_virtual_pure = EINA_TRUE; break; + case SET: fid->set_virtual_pure = EINA_TRUE; break; + default: return EINA_FALSE; + } return EINA_TRUE; } EAPI Eina_Bool -eolian_function_is_virtual_pure(Eolian_Function function_id) +eolian_function_is_virtual_pure(Eolian_Function function_id, Eolian_Function_Type ftype) { _Function_Id *fid = (_Function_Id *)function_id; EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE); - return fid->virtual_pure; + switch (ftype) + { + case UNRESOLVED: case METHOD_FUNC: case GET: return fid->get_virtual_pure; break; + case SET: return fid->set_virtual_pure; break; + default: return EINA_FALSE; + } } void diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 8de18ebce8..44ce8ad42f 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -105,7 +105,7 @@ void database_function_return_flag_set_own(Eolian_Function foo_id, void database_function_object_set_as_const(Eolian_Function foo_id, Eina_Bool is_const); Eina_Bool -database_function_set_as_virtual_pure(Eolian_Function function_id); +database_function_set_as_virtual_pure(Eolian_Function function_id, Eolian_Function_Type type); /* Need to add API for callbacks and implements */