Ver a proveniência

Fix floating point comparison and assignment operators.

master
Ian Piumarta há 11 meses
ascendente
cometimento
4d396d6170
1 ficheiros alterados com 9 adições e 5 eliminações
  1. +9
    -5
      minproto.leg

+ 9
- 5
minproto.leg Ver ficheiro

@ -1,6 +1,6 @@
# minproto.leg -- minimal prototype langauge for semantic experiments
#
# last edited: 2024-05-28 16:25:46 by piumarta on zora-1034.local
# last edited: 2024-05-29 09:06:22 by piumarta on m1mbp
%{
;
@ -985,7 +985,10 @@ intptr_t cmp(oop l, oop r, char *who)
{
int tl = getType(l), tr = getType(r);
if (Integer == tl && Integer == tr) return _integerValue(l) - _integerValue(r);
if (Float == tl || Float == tr) return floatValue(l, who) - floatValue(r, who);
if (Float == tl || Float == tr) {
double ll = floatValue(l, who), rr = floatValue(r, who);
return ll < rr ? -1 : (ll > rr ? 1 : 0);
}
if (String == tl && String == tr) {
int ll = _get(l, String,length), rr = _get(r, String,length);
if (ll == rr) return strncmp(_get(l, String,value), _get(r, String,value), ll);
@ -2485,9 +2488,9 @@ oop Binop_eval(oop exp, oop env)
oop *ref = (oop *)(intptr_t)_integerValue(lhs);
return *ref = rhs;
}
case opPreOr ... opPreMod: { assert(isInteger(lhs)); // ref
case opPreOr ... opPreMod: {
oop *ref = (oop *)(intptr_t)_integerValue(lhs);
oop val = *ref; assert(isInteger(rhs)); // delta
oop val = *ref;
switch (code) {
case opPreOr ... opPreShr: {
long l = integerValue(val, binopNames[code]);
@ -2797,7 +2800,8 @@ oop For_eval(oop exp, oop env)
oop result = eval(initialise, env2);
int n = 0;
LOOP();
if (n++) goto doContinue;
if (n) goto doContinue;
n = 1;
for (;;) {
if (nil == eval(condition, env2)) break;
result = eval(body, env2);

Carregando…
Cancelar
Guardar