q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=706de57b9fa401bc8e65c24b1ce9d3130adc550d
commit 706de57b9fa401bc8e65c24b1ce9d3130adc550d Author: Daniel Kolesa <d.kol...@osg.samsung.com> Date: Thu Aug 10 12:41:03 2017 +0200 eolian: implement proper return type serialization This accounts for const so that you can't generate functions that return const values, as that makes no sense. @fix T5024 --- src/lib/eolian/database_type.c | 52 ++++++++++++++++++++++++++++++++------ src/lib/eolian/database_type_api.c | 4 +-- src/lib/eolian/eo_parser.c | 34 +++---------------------- src/lib/eolian/eolian_database.h | 4 ++- 4 files changed, 52 insertions(+), 42 deletions(-) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index 0b2202383a..ddff419fae 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -67,6 +67,34 @@ database_enum_add(Eolian_Typedecl *tp) database_decl_add(tp->full_name, EOLIAN_DECL_ENUM, tp->base.file, tp); } +static const Eina_Bool _ownable_types[] = { + EINA_FALSE, /* unknown */ + EINA_FALSE, /* void */ + EINA_FALSE, /* regular */ + EINA_TRUE, /* complex */ + EINA_TRUE, /* pointer */ + EINA_TRUE, /* class */ + EINA_TRUE, /* static array */ + EINA_TRUE, /* terminated array */ + EINA_FALSE /* undefined */ +}; + +Eina_Bool +database_type_is_ownable(const Eolian_Type *tp) +{ + if (tp->is_ptr) + return EINA_TRUE; + if (tp->type == EOLIAN_TYPE_REGULAR) + { + int kwid = eo_lexer_keyword_str_to_id(tp->name); + const char *ct = eo_lexer_get_c_type(kwid); + if (!ct) + return EINA_FALSE; + return (ct[strlen(ct) - 1] == '*'); + } + return _ownable_types[tp->type]; +} + static void _buf_add_suffix(Eina_Strbuf *buf, const char *suffix) { @@ -77,16 +105,22 @@ _buf_add_suffix(Eina_Strbuf *buf, const char *suffix) } void -database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) +database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name, + Eolian_C_Type_Type ctype) { - if ((tp->type == EOLIAN_TYPE_REGULAR - || tp->type == EOLIAN_TYPE_COMPLEX - || tp->type == EOLIAN_TYPE_VOID + if ((tp->type == EOLIAN_TYPE_COMPLEX || tp->type == EOLIAN_TYPE_CLASS) && tp->is_const) { eina_strbuf_append(buf, "const "); } + if ((tp->type == EOLIAN_TYPE_REGULAR + || tp->type == EOLIAN_TYPE_VOID) + && tp->is_const + && ((ctype != EOLIAN_C_TYPE_RETURN) || database_type_is_ownable(tp))) + { + eina_strbuf_append(buf, "const "); + } if (tp->type == EOLIAN_TYPE_REGULAR || tp->type == EOLIAN_TYPE_COMPLEX || tp->type == EOLIAN_TYPE_CLASS) @@ -111,9 +145,10 @@ database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name) else { /* handles arrays and pointers as they all serialize to pointers */ - database_type_to_str(tp->base_type, buf, NULL); + database_type_to_str(tp->base_type, buf, NULL, EOLIAN_C_TYPE_DEFAULT); _buf_add_suffix(buf, "*"); - if (tp->is_const) eina_strbuf_append(buf, " const"); + if (tp->is_const && (ctype != EOLIAN_C_TYPE_RETURN)) + eina_strbuf_append(buf, " const"); } if (tp->type == EOLIAN_TYPE_COMPLEX || tp->type == EOLIAN_TYPE_CLASS) _buf_add_suffix(buf, "*"); @@ -140,7 +175,7 @@ _stype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf) eina_strbuf_append(buf, " { "); EINA_LIST_FOREACH(tp->field_list, l, sf) { - database_type_to_str(sf->type, buf, sf->name); + database_type_to_str(sf->type, buf, sf->name, EOLIAN_C_TYPE_DEFAULT); eina_strbuf_append(buf, "; "); } eina_strbuf_append(buf, "}"); @@ -212,7 +247,8 @@ _atype_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf) Eina_Strbuf *fulln = eina_strbuf_new(); _append_name(tp, fulln); - database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln)); + database_type_to_str(tp->base_type, buf, eina_strbuf_string_get(fulln), + EOLIAN_C_TYPE_DEFAULT); eina_strbuf_free(fulln); } diff --git a/src/lib/eolian/database_type_api.c b/src/lib/eolian/database_type_api.c index 47d994e584..e986611fe6 100644 --- a/src/lib/eolian/database_type_api.c +++ b/src/lib/eolian/database_type_api.c @@ -355,13 +355,13 @@ eolian_typedecl_is_extern(const Eolian_Typedecl *tp) } EAPI Eina_Stringshare * -eolian_type_c_type_get(const Eolian_Type *tp, Eolian_C_Type_Type ctype EINA_UNUSED) +eolian_type_c_type_get(const Eolian_Type *tp, Eolian_C_Type_Type ctype) { Eina_Stringshare *ret; Eina_Strbuf *buf; EINA_SAFETY_ON_NULL_RETURN_VAL(tp, NULL); buf = eina_strbuf_new(); - database_type_to_str(tp, buf, NULL); + database_type_to_str(tp, buf, NULL, ctype); ret = eina_stringshare_add(eina_strbuf_string_get(buf)); eina_strbuf_free(buf); return ret; diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index f4bcb83724..ddb49f30c1 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -684,38 +684,10 @@ _parse_dep(Eo_Lexer *ls, const char *fname, const char *name) } } -static const Eina_Bool _ownable_types[] = { - EINA_FALSE, /* unknown */ - EINA_FALSE, /* void */ - EINA_FALSE, /* regular */ - EINA_TRUE, /* complex */ - EINA_TRUE, /* pointer */ - EINA_TRUE, /* class */ - EINA_TRUE, /* static array */ - EINA_TRUE, /* terminated array */ - EINA_FALSE /* undefined */ -}; - -static Eina_Bool -_type_is_ownable(Eolian_Type *tp) -{ - if (tp->is_ptr) - return EINA_TRUE; - if (tp->type == EOLIAN_TYPE_REGULAR) - { - int kwid = eo_lexer_keyword_str_to_id(tp->name); - const char *ct = eo_lexer_get_c_type(kwid); - if (!ct) - return EINA_FALSE; - return (ct[strlen(ct) - 1] == '*'); - } - return _ownable_types[tp->type]; -} - static Eina_Bool _type_is_terminatable(Eolian_Type *tp) { - if (_type_is_ownable(tp)) + if (database_type_is_ownable(tp)) return EINA_TRUE; if (tp->type == EOLIAN_TYPE_REGULAR) { @@ -769,7 +741,7 @@ parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ref, Eina_Bool allow_sarray) check_next(ls, '('); eo_lexer_context_push(ls); def = parse_type_void(ls, allow_ref, EINA_FALSE); - if (!_type_is_ownable(def)) + if (!database_type_is_ownable(def)) { eo_lexer_context_restore(ls); eo_lexer_syntax_error(ls, "ownable type expected"); @@ -789,7 +761,7 @@ parse_type_void(Eo_Lexer *ls, Eina_Bool allow_ref, Eina_Bool allow_sarray) check_next(ls, '('); eo_lexer_context_push(ls); def = parse_type_void(ls, allow_ref, EINA_FALSE); - if (!_type_is_ownable(def)) + if (!database_type_is_ownable(def)) { eo_lexer_context_restore(ls); eo_lexer_syntax_error(ls, "freeable type expected"); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index c088412898..bb7f5ba348 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -312,9 +312,11 @@ void database_enum_add(Eolian_Typedecl *tp); void database_type_del(Eolian_Type *tp); void database_typedecl_del(Eolian_Typedecl *tp); -void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name); +void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name, Eolian_C_Type_Type ctype); void database_typedecl_to_str(const Eolian_Unit *src, const Eolian_Typedecl *tp, Eina_Strbuf *buf); +Eina_Bool database_type_is_ownable(const Eolian_Type *tp); + /* expressions */ Eolian_Value database_expr_eval(const Eolian_Unit *unit, const Eolian_Expression *expr, Eolian_Expression_Mask mask); --