eolian: unary expr eval for floats and add a signed number mask

This adds a new mask for all signed numbers (sint + float) and
fixes unary expr evaluation for floats, as well as fixes eval
error messages.
This commit is contained in:
Daniel Kolesa 2016-12-14 17:28:50 +01:00
parent b4740389f9
commit c813e94606
5 changed files with 19 additions and 14 deletions

View File

@ -109,6 +109,7 @@ ffi.cdef [[
EOLIAN_MASK_STRING = 1 << 4, EOLIAN_MASK_STRING = 1 << 4,
EOLIAN_MASK_CHAR = 1 << 5, EOLIAN_MASK_CHAR = 1 << 5,
EOLIAN_MASK_NULL = 1 << 6, EOLIAN_MASK_NULL = 1 << 6,
EOLIAN_MASK_SIGNED = EOLIAN_MASK_SINT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_NUMBER = EOLIAN_MASK_INT | EOLIAN_MASK_FLOAT, EOLIAN_MASK_NUMBER = EOLIAN_MASK_INT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_ALL = EOLIAN_MASK_NUMBER | EOLIAN_MASK_BOOL EOLIAN_MASK_ALL = EOLIAN_MASK_NUMBER | EOLIAN_MASK_BOOL
| EOLIAN_MASK_STRING | EOLIAN_MASK_CHAR | EOLIAN_MASK_STRING | EOLIAN_MASK_CHAR
@ -1222,6 +1223,7 @@ M.expression_mask = {
local emask = M.expression_mask local emask = M.expression_mask
emask.INT = bit.bor(emask.SINT , emask.UINT ) emask.INT = bit.bor(emask.SINT , emask.UINT )
emask.SIGNED = bit.bor(emask.SINT , emask.FLOAT)
emask.NUMBER = bit.bor(emask.INT , emask.FLOAT) emask.NUMBER = bit.bor(emask.INT , emask.FLOAT)
emask.ALL = bit.bor(emask.NUMBER, emask.BOOL, emask.ALL = bit.bor(emask.NUMBER, emask.BOOL,
emask.STRING, emask.CHAR, emask.NULL) emask.STRING, emask.CHAR, emask.NULL)

View File

@ -19,7 +19,7 @@ class Efl.Loop.Timer (Efl.Loop_User)
get { get {
} }
values { values {
in: double(-1); [[The new interval in seconds]] in: double(-1.0); [[The new interval in seconds]]
} }
} }
@property pending { @property pending {

View File

@ -254,6 +254,7 @@ typedef enum
EOLIAN_MASK_STRING = 1 << 4, EOLIAN_MASK_STRING = 1 << 4,
EOLIAN_MASK_CHAR = 1 << 5, EOLIAN_MASK_CHAR = 1 << 5,
EOLIAN_MASK_NULL = 1 << 6, EOLIAN_MASK_NULL = 1 << 6,
EOLIAN_MASK_SIGNED = EOLIAN_MASK_SINT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_NUMBER = EOLIAN_MASK_INT | EOLIAN_MASK_FLOAT, EOLIAN_MASK_NUMBER = EOLIAN_MASK_INT | EOLIAN_MASK_FLOAT,
EOLIAN_MASK_ALL = EOLIAN_MASK_NUMBER | EOLIAN_MASK_BOOL EOLIAN_MASK_ALL = EOLIAN_MASK_NUMBER | EOLIAN_MASK_BOOL
| EOLIAN_MASK_STRING | EOLIAN_MASK_CHAR | EOLIAN_MASK_STRING | EOLIAN_MASK_CHAR

View File

@ -50,7 +50,7 @@ mask_to_str(int mask, char *buf)
} }
static Eina_Bool static Eina_Bool
expr_type_error(const Eolian_Expression *expr, int type, int mask) expr_type_error(const Eolian_Expression *expr, int mask, int type)
{ {
char buf[512]; char buf[512];
char ebuf[256]; char ebuf[256];
@ -153,9 +153,9 @@ promote(Eolian_Expression *a, Eolian_Expression *b)
assert(a->type && b->type); assert(a->type && b->type);
/* not a number */ /* not a number */
if (a->type >= EOLIAN_EXPR_STRING) if (a->type >= EOLIAN_EXPR_STRING)
return expr_type_error(a, expr_type_to_mask(a), EOLIAN_MASK_NUMBER); return expr_type_error(a, EOLIAN_MASK_NUMBER, expr_type_to_mask(a));
if (b->type >= EOLIAN_EXPR_STRING) if (b->type >= EOLIAN_EXPR_STRING)
return expr_type_error(b, expr_type_to_mask(b), EOLIAN_MASK_NUMBER); return expr_type_error(b, EOLIAN_MASK_NUMBER, expr_type_to_mask(b));
/* no need for promotion */ /* no need for promotion */
if (a->type == b->type) return EINA_TRUE; if (a->type == b->type) return EINA_TRUE;
/* if either operand is floating point, everything has to be */ /* if either operand is floating point, everything has to be */
@ -191,26 +191,28 @@ eval_unary(const Eolian_Expression *expr, Eolian_Expression_Mask mask,
case EOLIAN_UNOP_UNP: case EOLIAN_UNOP_UNP:
{ {
/* no-op, but still typecheck */ /* no-op, but still typecheck */
if (!(mask & EOLIAN_MASK_SINT)) if (!(mask & EOLIAN_MASK_SIGNED))
return expr_type_error(expr, EOLIAN_MASK_SINT, mask); return expr_type_error(expr, EOLIAN_MASK_SIGNED, mask);
return eval_exp(expr->expr, EOLIAN_MASK_SINT, out); return eval_exp(expr->expr, EOLIAN_MASK_SIGNED, out);
} }
case EOLIAN_UNOP_UNM: case EOLIAN_UNOP_UNM:
{ {
Eolian_Expression exp; Eolian_Expression exp;
if (!(mask & EOLIAN_MASK_SINT)) if (!(mask & EOLIAN_MASK_SIGNED))
return expr_type_error(expr, EOLIAN_MASK_SINT, mask); return expr_type_error(expr, EOLIAN_MASK_SIGNED, mask);
if (!eval_exp(expr->expr, EOLIAN_MASK_SINT, &exp)) if (!eval_exp(expr->expr, EOLIAN_MASK_SIGNED, &exp))
return EINA_FALSE; return EINA_FALSE;
switch (exp.type) switch (exp.type)
{ {
case EOLIAN_EXPR_LLONG: exp.value.ll = -(exp.value.ll); break; case EOLIAN_EXPR_LLONG : exp.value.ll = -(exp.value.ll); break;
case EOLIAN_EXPR_LONG : exp.value.l = -(exp.value.l ); break; case EOLIAN_EXPR_LONG : exp.value.l = -(exp.value.l ); break;
case EOLIAN_EXPR_INT : exp.value.i = -(exp.value.i ); break; case EOLIAN_EXPR_INT : exp.value.i = -(exp.value.i ); break;
case EOLIAN_EXPR_FLOAT : exp.value.f = -(exp.value.f ); break;
case EOLIAN_EXPR_DOUBLE: exp.value.d = -(exp.value.d ); break;
default: return EINA_FALSE; default: return EINA_FALSE;
} }

View File

@ -51,7 +51,7 @@ class Evas.Text (Efl.Canvas.Object, Efl.Text, Efl.Text.Properties, Efl.Canvas.Fi
get { get {
} }
values { values {
ellipsis: double(-1); [[The ellipsis. Allowed values: -1.0 or 0.0-1.0]] ellipsis: double(-1.0); [[The ellipsis. Allowed values: -1.0 or 0.0-1.0]]
} }
} }
@property bidi_delimiters { @property bidi_delimiters {