From 3a55fe0bbf2887851f7cbdb828227a3ae74bb0a4 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 3 May 2018 17:10:31 +0200 Subject: [PATCH] eolian: allow void and non-ownable types in future --- src/lib/eolian/database_expr.c | 2 +- src/lib/eolian/database_type.c | 8 +++++--- src/lib/eolian/database_validate.c | 8 ++++---- src/lib/eolian/eo_parser.c | 5 ++++- src/lib/eolian/eolian_database.h | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/lib/eolian/database_expr.c b/src/lib/eolian/database_expr.c index 1b38dd4de1..a03c8208a0 100644 --- a/src/lib/eolian/database_expr.c +++ b/src/lib/eolian/database_expr.c @@ -610,7 +610,7 @@ database_expr_eval_type(const Eolian_Unit *unit, Eolian_Expression *expr, return database_expr_eval(unit, expr, EOLIAN_MASK_NULL, cb, data); case EOLIAN_TYPE_REGULAR: { - if (database_type_is_ownable(unit, type)) + if (database_type_is_ownable(unit, type, EINA_FALSE)) return database_expr_eval(unit, expr, EOLIAN_MASK_NULL, cb, data); int kw = eo_lexer_keyword_str_to_id(type->base.name); if (!kw || kw < KW_byte || kw >= KW_void) diff --git a/src/lib/eolian/database_type.c b/src/lib/eolian/database_type.c index eec9621efe..31517d6487 100644 --- a/src/lib/eolian/database_type.c +++ b/src/lib/eolian/database_type.c @@ -61,7 +61,7 @@ database_enum_add(Eolian_Unit *unit, Eolian_Typedecl *tp) } Eina_Bool -database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp) +database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp, Eina_Bool allow_void) { if (tp->is_ptr) return EINA_TRUE; @@ -77,11 +77,13 @@ database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp) if (tpp->type == EOLIAN_TYPEDECL_FUNCTION_POINTER) return EINA_TRUE; if (tpp->type == EOLIAN_TYPEDECL_ALIAS) - return database_type_is_ownable(unit, tpp->base_type); + return database_type_is_ownable(unit, tpp->base_type, allow_void); return EINA_FALSE; } return (ct[strlen(ct) - 1] == '*'); } + if (allow_void && (tp->type == EOLIAN_TYPE_VOID)) + return EINA_TRUE; return (tp->type == EOLIAN_TYPE_CLASS); } @@ -117,7 +119,7 @@ database_type_to_str(const Eolian_Type *tp, || tp->type == EOLIAN_TYPE_CLASS || tp->type == EOLIAN_TYPE_VOID) && tp->is_const - && ((ctype != EOLIAN_C_TYPE_RETURN) || database_type_is_ownable(NULL, tp))) + && ((ctype != EOLIAN_C_TYPE_RETURN) || database_type_is_ownable(NULL, tp, EINA_FALSE))) { eina_strbuf_append(buf, "const "); } diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c index 67229edea5..15ac5756b5 100644 --- a/src/lib/eolian/database_validate.c +++ b/src/lib/eolian/database_validate.c @@ -200,7 +200,7 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) const Eolian_Unit *src = tp->base.unit; char buf[256]; - if (tp->owned && !database_type_is_ownable(src, tp)) + if (tp->owned && !database_type_is_ownable(src, tp, EINA_FALSE)) { snprintf(buf, sizeof(buf), "type '%s' is not ownable", tp->base.name); return _obj_error(&tp->base, buf); @@ -209,7 +209,7 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) if (tp->is_ptr && !tp->legacy) { tp->is_ptr = EINA_FALSE; - Eina_Bool still_ownable = database_type_is_ownable(src, tp); + Eina_Bool still_ownable = database_type_is_ownable(src, tp, EINA_FALSE); tp->is_ptr = EINA_TRUE; if (still_ownable) { @@ -238,9 +238,9 @@ _validate_type(Validate_State *vals, Eolian_Type *tp) { if (!_validate_type(vals, itp)) return EINA_FALSE; - if ((kwid >= KW_accessor) && (kwid <= KW_list)) + if ((kwid >= KW_accessor) && (kwid <= KW_list) && (kwid != KW_future)) { - if (!database_type_is_ownable(src, itp)) + if (!database_type_is_ownable(src, itp, EINA_TRUE)) { snprintf(buf, sizeof(buf), "%s cannot contain value types (%s)", diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 24bb0722ef..096a883b85 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -718,7 +718,10 @@ parse_type_void(Eo_Lexer *ls) { int bline = ls->line_number, bcol = ls->column; check_next(ls, '<'); - def->base_type = eo_lexer_type_release(ls, parse_type(ls)); + if (tpid == KW_future) + def->base_type = eo_lexer_type_release(ls, parse_type_void(ls)); + else + def->base_type = eo_lexer_type_release(ls, parse_type(ls)); if ((def->base_type->owned = (ls->t.kw == KW_at_owned))) eo_lexer_get(ls); if (tpid == KW_hash) diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index 91cec5cfe8..dfbad0c304 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -407,7 +407,7 @@ void database_typedecl_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf); Eolian_Typedecl *database_type_decl_find(const Eolian_Unit *src, const Eolian_Type *tp); -Eina_Bool database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp); +Eina_Bool database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp, Eina_Bool allow_void); /* expressions */