q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=11ad2b94fff68c0ed1448598aa5371f6cdb008e9

commit 11ad2b94fff68c0ed1448598aa5371f6cdb008e9
Author: Daniel Kolesa <d.kol...@osg.samsung.com>
Date:   Fri Sep 15 15:51:25 2017 +0200

    eolian: initial parsing for @owned
    
    This is the new ownership system for Eolian, working on params,
    returns, struct fields or events directly rather than specifying
    ownership at type level. As the new system will evolve it will
    gain missing features and necessary checks.
---
 src/lib/eolian/eo_lexer.h        |  2 +-
 src/lib/eolian/eo_parser.c       | 31 ++++++++++++++++++++++++++++---
 src/lib/eolian/eolian_database.h |  5 +++++
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h
index 9a82bca2ed..8d7cb214bd 100644
--- a/src/lib/eolian/eo_lexer.h
+++ b/src/lib/eolian/eo_lexer.h
@@ -31,7 +31,7 @@ enum Tokens
     KW(set), KW(type), KW(values), KW(var), KWAT(auto), KWAT(beta), \
     KWAT(class), KWAT(const), KWAT(empty), KWAT(extern), \
     KWAT(free), KWAT(hot), KWAT(in), KWAT(inout), KWAT(nonull), 
KWAT(nullable), \
-    KWAT(optional), KWAT(out), KWAT(private), KWAT(property), \
+    KWAT(optional), KWAT(out), KWAT(owned), KWAT(private), KWAT(property), \
     KWAT(protected), KWAT(restart), KWAT(pure_virtual), KWAT(warn_unused), \
     \
     KW(byte), KW(ubyte), KW(char), KW(short), KW(ushort), KW(int), KW(uint), \
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 5a3599f9c0..3600d3571b 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -517,6 +517,9 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool 
is_extern,
         fdef->type = tp;
         fdef->name = eina_stringshare_ref(fname);
         pop_type(ls);
+        fdef->owned = (ls->t.kw == KW_at_owned);
+        if (fdef->owned)
+          eo_lexer_get(ls);
         check_next(ls, ';');
         FILL_DOC(ls, fdef, doc);
      }
@@ -964,6 +967,7 @@ typedef struct _Eo_Ret_Def
    Eolian_Documentation *doc;
    Eolian_Expression *default_ret_val;
    Eina_Bool warn_unused: 1;
+   Eina_Bool owned: 1;
 } Eo_Ret_Def;
 
 static void
@@ -978,6 +982,7 @@ parse_return(Eo_Lexer *ls, Eo_Ret_Def *ret, Eina_Bool 
allow_void, Eina_Bool allo
    ret->doc = NULL;
    ret->default_ret_val = NULL;
    ret->warn_unused = EINA_FALSE;
+   ret->owned = EINA_FALSE;
    if (allow_def && (ls->t.token == '('))
      {
         int line = ls->line_number, col = ls->column;
@@ -987,7 +992,7 @@ parse_return(Eo_Lexer *ls, Eo_Ret_Def *ret, Eina_Bool 
allow_void, Eina_Bool allo
         ls->expr_mode = EINA_FALSE;
         check_match(ls, ')', '(', line, col);
      }
-   Eina_Bool has_warn_unused = EINA_FALSE;
+   Eina_Bool has_warn_unused = EINA_FALSE, has_owned = EINA_FALSE;
    for (;;) switch (ls->t.kw)
      {
       case KW_at_warn_unused:
@@ -995,6 +1000,11 @@ parse_return(Eo_Lexer *ls, Eo_Ret_Def *ret, Eina_Bool 
allow_void, Eina_Bool allo
         ret->warn_unused = EINA_TRUE;
         eo_lexer_get(ls);
         break;
+      case KW_at_owned:
+        CASE_LOCK(ls, owned, "owned qualifier");
+        ret->owned = EINA_TRUE;
+        eo_lexer_get(ls);
+        break;
       default:
         goto end;
      }
@@ -1008,7 +1018,7 @@ parse_param(Eo_Lexer *ls, Eina_List **params, Eina_Bool 
allow_inout,
             Eina_Bool is_vals)
 {
    Eina_Bool has_nonull   = EINA_FALSE, has_optional = EINA_FALSE,
-             has_nullable = EINA_FALSE;
+             has_nullable = EINA_FALSE, has_owned    = EINA_FALSE;
    Eolian_Function_Parameter *par = calloc(1, 
sizeof(Eolian_Function_Parameter));
    par->param_dir = EOLIAN_IN_PARAM;
    FILL_BASE(par->base, ls, ls->line_number, ls->column);
@@ -1069,6 +1079,11 @@ parse_param(Eo_Lexer *ls, Eina_List **params, Eina_Bool 
allow_inout,
         par->nullable = EINA_TRUE;
         eo_lexer_get(ls);
         break;
+      case KW_at_owned:
+        CASE_LOCK(ls, owned, "owned qualifier");
+        par->owned = EINA_TRUE;
+        eo_lexer_get(ls);
+        break;
       default:
         goto end;
      }
@@ -1182,6 +1197,7 @@ parse_accessor:
              prop->get_return_doc = ret.doc;
              prop->get_ret_val = ret.default_ret_val;
              prop->get_return_warn_unused = ret.warn_unused;
+             prop->get_return_owned = ret.owned;
           }
         else
           {
@@ -1189,6 +1205,7 @@ parse_accessor:
              prop->set_return_doc = ret.doc;
              prop->set_ret_val = ret.default_ret_val;
              prop->set_return_warn_unused = ret.warn_unused;
+             prop->set_return_owned = ret.owned;
           }
         break;
       case KW_legacy:
@@ -1392,6 +1409,7 @@ parse_function_pointer(Eo_Lexer *ls)
         meth->get_return_doc = ret.doc;
         meth->get_ret_val = NULL;
         meth->get_return_warn_unused = EINA_FALSE;
+        meth->get_return_owned = EINA_FALSE;
         break;
       case KW_params:
         CASE_LOCK(ls, params, "params definition");
@@ -1486,6 +1504,7 @@ body:
         meth->get_return_doc = ret.doc;
         meth->get_ret_val = ret.default_ret_val;
         meth->get_return_warn_unused = ret.warn_unused;
+        meth->get_return_owned = ret.owned;
         break;
       case KW_legacy:
         CASE_LOCK(ls, legacy, "legacy name")
@@ -1748,7 +1767,8 @@ parse_event(Eo_Lexer *ls)
    ev->name = eina_stringshare_add(eina_strbuf_string_get(buf));
    pop_strbuf(ls);
    Eina_Bool has_scope = EINA_FALSE, has_beta = EINA_FALSE,
-             has_hot   = EINA_FALSE, has_restart = EINA_FALSE;
+             has_hot   = EINA_FALSE, has_restart = EINA_FALSE,
+             has_owned = EINA_FALSE;
    for (;;) switch (ls->t.kw)
      {
       case KW_at_private:
@@ -1774,6 +1794,11 @@ parse_event(Eo_Lexer *ls)
         ev->is_restart = EINA_TRUE;
         eo_lexer_get(ls);
         break;
+      case KW_at_owned:
+        CASE_LOCK(ls, owned, "owned qualifier");
+        ev->owned = EINA_TRUE;
+        eo_lexer_get(ls);
+        break;
       default:
         goto end;
      }
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 261f09cad2..16a2a97981 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -131,6 +131,8 @@ struct _Eolian_Function
    Eina_Bool obj_is_const :1; /* True if the object has to be const. Useful 
for a few methods. */
    Eina_Bool get_return_warn_unused :1; /* also used for methods */
    Eina_Bool set_return_warn_unused :1;
+   Eina_Bool get_return_owned :1;
+   Eina_Bool set_return_owned :1;
    Eina_Bool get_only_legacy: 1;
    Eina_Bool set_only_legacy: 1;
    Eina_Bool is_class :1;
@@ -150,6 +152,7 @@ struct _Eolian_Function_Parameter
    Eina_Bool nonull :1; /* True if this argument cannot be NULL - deprecated */
    Eina_Bool nullable :1; /* True if this argument is nullable */
    Eina_Bool optional :1; /* True if this argument is optional */
+   Eina_Bool owned :1;
 };
 
 struct _Eolian_Type
@@ -223,6 +226,7 @@ struct _Eolian_Event
    Eina_Bool is_beta :1;
    Eina_Bool is_hot  :1;
    Eina_Bool is_restart :1;
+   Eina_Bool owned :1;
 };
 
 struct _Eolian_Struct_Type_Field
@@ -231,6 +235,7 @@ struct _Eolian_Struct_Type_Field
    Eolian_Object     base;
    Eolian_Type      *type;
    Eolian_Documentation *doc;
+   Eina_Bool owned :1;
 };
 
 struct _Eolian_Enum_Type_Field

-- 


Reply via email to