summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2020-04-26 02:29:35 +0200
committerDaniel Kolesa <d.kolesa@samsung.com>2020-04-26 02:29:35 +0200
commitd261dca06c748675add162a0dd1c7bfd992eae1d (patch)
treeefd08d0a03cb3bc28cd8e04f47a6203b3a00b626
parent680dee1daf2a2942bcc08bc7724ffcc52743202a (diff)
downloadefl-d261dca06c748675add162a0dd1c7bfd992eae1d.tar.gz
eolian: require opaque structs to be used by ref always
For now only in stable API.
-rw-r--r--src/lib/eolian/database_validate.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/lib/eolian/database_validate.c b/src/lib/eolian/database_validate.c
index 2b6fa24058..91a679bc33 100644
--- a/src/lib/eolian/database_validate.c
+++ b/src/lib/eolian/database_validate.c
@@ -285,7 +285,8 @@ _validate_typedecl(Validate_State *vals, Eolian_Typedecl *tp)
}
static Eina_Bool
-_validate_by_ref(Eolian_Type *tp, Eina_Bool by_ref, Eina_Bool move)
+_validate_by_ref(Validate_State *vals, Eolian_Type *tp, Eina_Bool by_ref,
+ Eina_Bool move)
{
Eina_Bool maybe_ownable =
database_type_is_ownable(tp->base.unit, tp, EINA_FALSE, NULL);
@@ -301,6 +302,15 @@ _validate_by_ref(Eolian_Type *tp, Eina_Bool by_ref, Eina_Bool move)
if (tp->btype == EOLIAN_TYPE_BUILTIN_FUTURE)
return EINA_TRUE;
+ if (tp->tdecl && (tp->tdecl->type == EOLIAN_TYPEDECL_STRUCT_OPAQUE))
+ {
+ if (vals->stable && !maybe_ownable && !by_ref)
+ {
+ _eo_parser_log(&tp->base, "opaque structs must be by reference");
+ return EINA_FALSE;
+ }
+ }
+
/* not marked @move, or marked @by_ref; just validate */
if (!move || by_ref)
return EINA_TRUE;
@@ -322,7 +332,7 @@ _validate_type_by_ref(Validate_State *vals, Eolian_Type *tp,
if (!_validate_type(vals, tp, by_ref, is_ret))
return EINA_FALSE;
- return _validate_by_ref(tp, by_ref, move);
+ return _validate_by_ref(vals, tp, by_ref, move);
}
static Eina_Bool