Шрифт:
d = pop;
d.val = (*(double(*))(*pc++))(d.val);
push(d);
}
eval /* Evaluate variable on stack */ {
Datum d;
d = pop;
if (d.sym->type != VAR && d.sym->type != UNDEF)
execerror("attempt to evaluate non-variable", d.sym->name);
if (d.sym->type == UNDEF)
execerror("undefined variable", d.sym->name);
d.val = d.sym->u.val;
push(d);
}
add {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val += d2.val;
push(d1);
}
sub {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val -= d2.val;
push(d1);
}
mul {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val *= d2.val;
push(d1);
}
div {
Datum d1, d2;
d2 = pop;
if (d2.val == 0.0)
execerror("division by zero", (char*)0);
d1 = pop;
d1.val /= d2.val;
push(d1);
}
negate {
Datum d;
d = pop;
d.val = -d.val;
push(d);
}
gt {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val > d2.val);
push(d1);
}
lt {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val < d2.val);
push(d1);
}
ge {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val >= d2.val);
push(d1);
}
le {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val <= d2.val);
push(d1);
}
eq {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val == d2.val);
push(d1);
}
ne {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val != d2.val);
push(d1);
}
and {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val != 0.0 && d2.val != 0.0);
push(d1);
}
or {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val != 0.0 || d2.val != 0.0);
push(d1);
}
not {