eolian: make sure to include by_ref in validation of expressions

This commit is contained in:
Daniel Kolesa 2019-09-04 18:05:49 +02:00
parent 6751f011c1
commit 917b5feb27
1 changed files with 13 additions and 8 deletions

View File

@ -109,7 +109,8 @@ static Eina_Bool _validate_type_by_ref(Validate_State *vals, Eolian_Type *tp,
Eina_Bool by_ref, Eina_Bool move);
static Eina_Bool _validate_expr(Eolian_Expression *expr,
const Eolian_Type *tp,
Eolian_Expression_Mask msk);
Eolian_Expression_Mask msk,
Eina_Bool by_ref);
static Eina_Bool _validate_function(Validate_State *vals,
Eolian_Function *func,
Eina_Hash *nhash);
@ -139,7 +140,7 @@ _ef_map_cb(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED,
const Eolian_Enum_Type_Field *ef, Cb_Ret *sc)
{
if (ef->value)
sc->succ = _validate_expr(ef->value, NULL, EOLIAN_MASK_INT);
sc->succ = _validate_expr(ef->value, NULL, EOLIAN_MASK_INT, EINA_FALSE);
else
sc->succ = EINA_TRUE;
@ -400,10 +401,12 @@ _validate_type(Validate_State *vals, Eolian_Type *tp)
static Eina_Bool
_validate_expr(Eolian_Expression *expr, const Eolian_Type *tp,
Eolian_Expression_Mask msk)
Eolian_Expression_Mask msk, Eina_Bool by_ref)
{
Eolian_Value val;
if (tp)
if (by_ref)
val = database_expr_eval(expr->base.unit, expr, EOLIAN_MASK_NULL, NULL, NULL);
else if (tp)
val = database_expr_eval_type(expr->base.unit, expr, tp, NULL, NULL);
else
val = database_expr_eval(expr->base.unit, expr, msk, NULL, NULL);
@ -420,7 +423,7 @@ _validate_param(Validate_State *vals, Eolian_Function_Parameter *param)
if (!_validate_type_by_ref(vals, param->type, param->by_ref, param->move))
return EINA_FALSE;
if (param->value && !_validate_expr(param->value, param->type, 0))
if (param->value && !_validate_expr(param->value, param->type, 0, param->by_ref))
return EINA_FALSE;
if (!_validate_doc(param->doc))
@ -468,11 +471,13 @@ _validate_function(Validate_State *vals, Eolian_Function *func, Eina_Hash *nhash
return _reset_stable(vals, was_stable, EINA_FALSE);
if (func->get_ret_val && !_validate_expr(func->get_ret_val,
func->get_ret_type, 0))
func->get_ret_type, 0,
func->get_return_by_ref))
return _reset_stable(vals, was_stable, EINA_FALSE);
if (func->set_ret_val && !_validate_expr(func->set_ret_val,
func->set_ret_type, 0))
func->set_ret_type, 0,
func->set_return_by_ref))
return _reset_stable(vals, was_stable, EINA_FALSE);
#define EOLIAN_PARAMS_VALIDATE(params) \
@ -1434,7 +1439,7 @@ _validate_variable(Validate_State *vals, Eolian_Variable *var)
if (!_validate_type(vals, var->base_type))
return _reset_stable(vals, was_stable, EINA_FALSE);
if (var->value && !_validate_expr(var->value, var->base_type, 0))
if (var->value && !_validate_expr(var->value, var->base_type, 0, EINA_FALSE))
return _reset_stable(vals, was_stable, EINA_FALSE);
if (!_validate_doc(var->doc))