eolian: cache enum expr in the database
This commit is contained in:
parent
29a9b9ad44
commit
b70604d018
|
@ -183,11 +183,11 @@ promote(Eolian_Expression *a, Eolian_Expression *b)
|
|||
}
|
||||
|
||||
static Eina_Bool eval_exp(const Eolian_Unit *unit,
|
||||
const Eolian_Expression *expr,
|
||||
Eolian_Expression *expr,
|
||||
Eolian_Expression_Mask mask, Eolian_Expression *out);
|
||||
|
||||
static Eina_Bool
|
||||
eval_unary(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
||||
eval_unary(const Eolian_Unit *unit, Eolian_Expression *expr,
|
||||
Eolian_Expression_Mask mask, Eolian_Expression *out)
|
||||
{
|
||||
switch (expr->unop)
|
||||
|
@ -273,7 +273,7 @@ eval_unary(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
eval_promote_num(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
||||
eval_promote_num(const Eolian_Unit *unit, Eolian_Expression *expr,
|
||||
Eolian_Expression *lhs, Eolian_Expression *rhs, int mask,
|
||||
int emask)
|
||||
{
|
||||
|
@ -296,7 +296,7 @@ eval_promote_num(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
eval_binary(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
||||
eval_binary(const Eolian_Unit *unit, Eolian_Expression *expr,
|
||||
Eolian_Expression_Mask mask, Eolian_Expression *out)
|
||||
{
|
||||
#define APPLY_CASE(id, expr, lhs, rhs, fnm, op) \
|
||||
|
@ -437,7 +437,7 @@ split_enum_name(const char *str, char **ename, char **memb)
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
eval_exp(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
||||
eval_exp(const Eolian_Unit *unit, Eolian_Expression *expr,
|
||||
Eolian_Expression_Mask mask, Eolian_Expression *out)
|
||||
{
|
||||
switch (expr->type)
|
||||
|
@ -498,9 +498,16 @@ eval_exp(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
|||
}
|
||||
case EOLIAN_EXPR_NAME:
|
||||
{
|
||||
if (!unit)
|
||||
{
|
||||
if (!expr->expr)
|
||||
return expr_error(expr, "undefined value");
|
||||
return eval_exp(NULL, expr->expr, mask, out);
|
||||
}
|
||||
|
||||
const Eolian_Variable *var = eolian_variable_constant_get_by_name
|
||||
(unit, expr->value.s);
|
||||
const Eolian_Expression *exp = NULL;
|
||||
Eolian_Expression *exp = NULL;
|
||||
|
||||
if (!var)
|
||||
{
|
||||
|
@ -534,18 +541,19 @@ eval_exp(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
|||
}
|
||||
|
||||
fl = eolian_typedecl_enum_field_get(etpd, memb);
|
||||
if (fl) exp = eolian_typedecl_enum_field_value_get(fl, EINA_TRUE);
|
||||
if (fl) exp = (Eolian_Expression *)eolian_typedecl_enum_field_value_get(fl, EINA_TRUE);
|
||||
free(fulln);
|
||||
|
||||
if (!exp)
|
||||
return expr_error(expr, "invalid enum field");
|
||||
}
|
||||
else
|
||||
exp = var->value;
|
||||
exp = (Eolian_Expression *)var->value;
|
||||
|
||||
if (!exp)
|
||||
return expr_error(expr, "undefined variable");
|
||||
|
||||
expr->expr = exp;
|
||||
return eval_exp(unit, exp, mask, out);
|
||||
}
|
||||
case EOLIAN_EXPR_UNARY:
|
||||
|
@ -561,7 +569,7 @@ eval_exp(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
|||
}
|
||||
|
||||
Eolian_Value
|
||||
database_expr_eval(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
||||
database_expr_eval(const Eolian_Unit *unit, Eolian_Expression *expr,
|
||||
Eolian_Expression_Mask mask)
|
||||
{
|
||||
Eolian_Expression out;
|
||||
|
@ -577,7 +585,7 @@ database_expr_eval(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
|||
}
|
||||
|
||||
Eolian_Value
|
||||
database_expr_eval_type(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
||||
database_expr_eval_type(const Eolian_Unit *unit, Eolian_Expression *expr,
|
||||
const Eolian_Type *type)
|
||||
{
|
||||
Eolian_Value err;
|
||||
|
|
|
@ -13,7 +13,7 @@ eolian_expression_eval(const Eolian_Unit *unit, const Eolian_Expression *expr,
|
|||
Eolian_Value err;
|
||||
err.type = EOLIAN_EXPR_UNKNOWN;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, err);
|
||||
return database_expr_eval(unit, expr, m);
|
||||
return database_expr_eval(unit, (Eolian_Expression *)expr, m);
|
||||
}
|
||||
|
||||
EAPI Eolian_Value
|
||||
|
@ -24,7 +24,7 @@ eolian_expression_eval_type(const Eolian_Unit *unit,
|
|||
Eolian_Value err;
|
||||
err.type = EOLIAN_EXPR_UNKNOWN;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(expr, err);
|
||||
return database_expr_eval_type(unit, expr, type);
|
||||
return database_expr_eval_type(unit, (Eolian_Expression *)expr, type);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -292,9 +292,9 @@ _validate_expr(const Eolian_Unit *src, Eolian_Expression *expr,
|
|||
{
|
||||
Eolian_Value val;
|
||||
if (tp)
|
||||
val = eolian_expression_eval_type(src, expr, tp);
|
||||
val = database_expr_eval_type(src, expr, tp);
|
||||
else
|
||||
val = eolian_expression_eval(src, expr, msk);
|
||||
val = database_expr_eval(src, expr, msk);
|
||||
|
||||
if (val.type == EOLIAN_EXPR_UNKNOWN)
|
||||
return EINA_FALSE;
|
||||
|
|
|
@ -296,10 +296,13 @@ struct _Eolian_Expression
|
|||
};
|
||||
struct
|
||||
{
|
||||
Eolian_Unary_Operator unop;
|
||||
union
|
||||
{
|
||||
Eolian_Unary_Operator unop;
|
||||
Eolian_Value_Union value;
|
||||
};
|
||||
Eolian_Expression *expr;
|
||||
};
|
||||
Eolian_Value_Union value;
|
||||
};
|
||||
Eina_Bool weak_lhs :1;
|
||||
Eina_Bool weak_rhs :1;
|
||||
|
@ -347,8 +350,8 @@ Eina_Bool database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *t
|
|||
|
||||
/* expressions */
|
||||
|
||||
Eolian_Value database_expr_eval(const Eolian_Unit *unit, const Eolian_Expression *expr, Eolian_Expression_Mask mask);
|
||||
Eolian_Value database_expr_eval_type(const Eolian_Unit *unit, const Eolian_Expression *expr, const Eolian_Type *type);
|
||||
Eolian_Value database_expr_eval(const Eolian_Unit *unit, Eolian_Expression *expr, Eolian_Expression_Mask mask);
|
||||
Eolian_Value database_expr_eval_type(const Eolian_Unit *unit, Eolian_Expression *expr, const Eolian_Type *type);
|
||||
void database_expr_del(Eolian_Expression *expr);
|
||||
void database_expr_print(Eolian_Expression *expr);
|
||||
|
||||
|
|
Loading…
Reference in New Issue