Filter: Getting rid of RESULT_OK. Adding RESULT_VOID.

This is a preparation for filter pre-evaluation.
This commit is contained in:
Maria Matejka 2019-07-01 12:07:06 +02:00
parent 236828d06f
commit f74d19765e
2 changed files with 16 additions and 23 deletions

View file

@ -227,9 +227,9 @@ do { if (whati->fl$1) {
} } while(0)m4_dnl
FID_ALL()')
m4_define(RESULT_OK, `FID_INTERPRET_BODY()fstk->vcnt++FID_ALL()')
m4_define(RESULT, `RESULT_VAL([[ (struct f_val) { .type = $1, .val.$2 = $3 } ]])')
m4_define(RESULT_VAL, `FID_INTERPRET_BODY()do { res = $1; RESULT_OK; } while (0)FID_ALL()')
m4_define(RESULT_VAL, `FID_INTERPRET_BODY()do { res = $1; fstk->vcnt++; } while (0)FID_ALL()')
m4_define(RESULT_VOID, `RESULT_VAL([[ (struct f_val) { .type = T_VOID } ]])')
m4_define(SYMBOL, `FID_MEMBER(const struct symbol *, sym, sym,
[[strcmp(f1->sym->name, f2->sym->name) || (f1->sym->class != f2->sym->class)]], symbol %s, item->sym->name, const struct symbol *sym = whati->sym)')

View file

@ -36,7 +36,8 @@
* m4_dnl ACCESS_RTE; this instruction needs route
* m4_dnl ACCESS_EATTRS; this instruction needs extended attributes
* m4_dnl RESULT(type, union-field, value); putting this on value stack
* m4_dnl RESULT_OK; legalize what already is on the value stack
* m4_dnl RESULT_VAL(value-struct); pass the struct f_val directly
* m4_dnl RESULT_VOID; return undef
* m4_dnl }
*
* Other code is just copied into the interpreter part.
@ -50,41 +51,37 @@
INST(FI_ADD, 2, 1) {
ARG(1,T_INT);
ARG(2,T_INT);
res.val.i = v1.val.i + v2.val.i;
RESULT_OK;
RESULT(T_INT, i, v1.val.i + v2.val.i);
}
INST(FI_SUBTRACT, 2, 1) {
ARG(1,T_INT);
ARG(2,T_INT);
res.val.i = v1.val.i - v2.val.i;
RESULT_OK;
RESULT(T_INT, i, v1.val.i - v2.val.i);
}
INST(FI_MULTIPLY, 2, 1) {
ARG(1,T_INT);
ARG(2,T_INT);
res.val.i = v1.val.i * v2.val.i;
RESULT_OK;
RESULT(T_INT, i, v1.val.i * v2.val.i);
}
INST(FI_DIVIDE, 2, 1) {
ARG(1,T_INT);
ARG(2,T_INT);
if (v2.val.i == 0) runtime( "Mother told me not to divide by 0" );
res.val.i = v1.val.i / v2.val.i;
RESULT_OK;
RESULT(T_INT, i, v1.val.i / v2.val.i);
}
INST(FI_AND, 1, 1) {
ARG(1,T_BOOL);
if (res.val.i)
if (v1.val.i)
LINE(2,0);
else
RESULT_OK;
RESULT_VAL(v1);
}
INST(FI_OR, 1, 1) {
ARG(1,T_BOOL);
if (!res.val.i)
if (!v1.val.i)
LINE(2,0);
else
RESULT_OK;
RESULT_VAL(v1);
}
INST(FI_PAIR_CONSTRUCT, 2, 1) {
ARG(1,T_INT);
@ -281,8 +278,7 @@
INST(FI_VAR_GET, 0, 1) {
SYMBOL(1);
res = fstk->vstk[curline.vbase + sym->offset];
RESULT_OK;
RESULT_VAL(fstk->vstk[curline.vbase + sym->offset]);
}
/* some constants have value in a[1], some in *a[0].p, strange. */
@ -323,8 +319,7 @@
debug("%sconstant %s with value %s\n", INDENT, item->sym->name, val_dump(item->valp));
FID_ALL
res = *whati->valp;
RESULT_OK;
RESULT_VAL(*whati->valp);
}
INST(FI_PRINT, 1, 0) {
ARG_ANY(1);
@ -500,8 +495,7 @@
}
/* Undefined value */
res.type = T_VOID;
RESULT_OK;
RESULT_VOID;
break;
}
@ -534,8 +528,7 @@
RESULT(T_LCLIST, ad, e->u.ptr);
break;
case EAF_TYPE_UNDEF:
res.type = T_VOID;
RESULT_OK;
RESULT_VOID;
break;
default:
bug("Unknown dynamic attribute type");