\
KWAT(auto), KWAT(beta), KWAT(by_ref), KWAT(c_name), KWAT(const), \
KWAT(empty), KWAT(extern), KWAT(free), KWAT(hot), KWAT(in), KWAT(inout), \
- KWAT(no_unused), KWAT(nullable), KWAT(optional), KWAT(out), KWAT(owned), \
- KWAT(private), KWAT(property), KWAT(protected), KWAT(restart), \
- KWAT(pure_virtual), KWAT(static), KWAT(transfer), \
+ KWAT(move), KWAT(no_unused), KWAT(nullable), KWAT(optional), KWAT(out), \
+ KWAT(owned), KWAT(private), KWAT(property), KWAT(protected), KWAT(restart), \
+ KWAT(pure_virtual), KWAT(static), \
\
KWH(version), \
\
FILL_BASE(fdef->base, ls, fline, fcol, STRUCT_FIELD);
fdef->type = eo_lexer_type_release(ls, tp);
fdef->base.name = eina_stringshare_ref(fname);
- if ((fdef->type->owned = (ls->t.kw == KW_at_owned)))
- eo_lexer_get(ls);
+ Eina_Bool has_owned = EINA_FALSE, has_by_ref = EINA_FALSE;
+ for (;;) switch (ls->t.kw)
+ {
+ case KW_at_by_ref:
+ CASE_LOCK(ls, by_ref, "by_ref qualifier");
+ fdef->by_ref = EINA_TRUE;
+ eo_lexer_get(ls);
+ break;
+ case KW_at_owned:
+ case KW_at_move:
+ CASE_LOCK(ls, owned, "owned qualifier");
+ fdef->type->owned = fdef->move = EINA_TRUE;
+ eo_lexer_get(ls);
+ break;
+ default:
+ goto qual_end;
+ }
+qual_end:
check_next(ls, ';');
FILL_DOC(ls, fdef, doc);
}
def->base_type = eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
/* view-only types are not allowed to own the contents */
if (tpid == KW_array || tpid == KW_hash || tpid == KW_list || tpid == KW_future)
- if ((def->base_type->owned = (ls->t.kw == KW_at_owned)))
+ if ((def->base_type->owned = (ls->t.kw == KW_at_owned || ls->t.kw == KW_at_move)))
eo_lexer_get(ls);
if (tpid == KW_hash)
{
check_next(ls, ',');
def->base_type->next_type =
eo_lexer_type_release(ls, parse_type(ls, EINA_TRUE));
- if ((def->base_type->next_type->owned = (ls->t.kw == KW_at_owned)))
+ if ((def->base_type->next_type->owned = (ls->t.kw == KW_at_owned || ls->t.kw == KW_at_move)))
eo_lexer_get(ls);
}
check_match(ls, '>', '<', bline, bcol);
Eolian_Expression *default_ret_val;
Eina_Bool no_unused: 1;
Eina_Bool owned: 1;
+ Eina_Bool by_ref: 1;
} Eo_Ret_Def;
static void
ret->default_ret_val = NULL;
ret->no_unused = EINA_FALSE;
ret->owned = EINA_FALSE;
+ ret->by_ref = EINA_FALSE;
if (allow_def && (ls->t.token == '('))
{
int line = ls->line_number, col = ls->column;
ls->expr_mode = EINA_FALSE;
check_match(ls, ')', '(', line, col);
}
- Eina_Bool has_no_unused = EINA_FALSE, has_owned = EINA_FALSE;
+ Eina_Bool has_no_unused = EINA_FALSE, has_owned = EINA_FALSE,
+ has_by_ref = EINA_FALSE;
if (!is_funcptr) for (;;) switch (ls->t.kw)
{
case KW_at_no_unused:
eo_lexer_get(ls);
break;
case KW_at_owned:
+ case KW_at_move:
CASE_LOCK(ls, owned, "owned qualifier");
ret->owned = EINA_TRUE;
eo_lexer_get(ls);
break;
+ case KW_at_by_ref:
+ CASE_LOCK(ls, by_ref, "by_ref qualifier");
+ ret->by_ref = EINA_TRUE;
+ eo_lexer_get(ls);
+ break;
default:
goto end;
}
Eina_Bool is_vals)
{
Eina_Bool has_optional = EINA_FALSE,
- has_owned = EINA_FALSE;
+ has_owned = EINA_FALSE,
+ has_by_ref = 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, FUNCTION_PARAMETER);
break;
case KW_at_owned:
CASE_LOCK(ls, owned, "owned qualifier");
- par->type->owned = EINA_TRUE;
+ par->type->owned = par->move = EINA_TRUE;
+ eo_lexer_get(ls);
+ break;
+ case KW_at_by_ref:
+ CASE_LOCK(ls, by_ref, "by_ref qualifier");
+ par->by_ref = EINA_TRUE;
eo_lexer_get(ls);
break;
default:
prop->get_return_doc = ret.doc;
prop->get_ret_val = ret.default_ret_val;
prop->get_return_no_unused = ret.no_unused;
- prop->get_ret_type->owned = ret.owned;
+ prop->get_return_by_ref = ret.by_ref;
+ prop->get_return_move = prop->get_ret_type->owned = ret.owned;
}
else
{
prop->set_return_doc = ret.doc;
prop->set_ret_val = ret.default_ret_val;
prop->set_return_no_unused = ret.no_unused;
- prop->set_ret_type->owned = ret.owned;
+ prop->set_return_by_ref = ret.by_ref;
+ prop->set_return_move = prop->set_ret_type->owned = ret.owned;
}
break;
case KW_keys:
meth->get_return_doc = ret.doc;
meth->get_ret_val = ret.default_ret_val;
meth->get_return_no_unused = ret.no_unused;
- meth->get_ret_type->owned = ret.owned;
+ meth->get_return_by_ref = ret.by_ref;
+ meth->get_return_move = meth->get_ret_type->owned = ret.owned;
break;
case KW_params:
CASE_LOCK(ls, params, "params definition")