fix pop-ing of nil values

This commit is contained in:
tocariimaa 2025-02-04 19:15:51 -03:00
parent 399ef3ab48
commit bf608ad103

26
pila.c
View file

@ -174,21 +174,22 @@ push_val(RpnState *st, Value val)
st->data_stack[st->sp++] = val; st->data_stack[st->sp++] = val;
} }
Value bool
top_val(RpnState *st) top_val(RpnState *st, Value *val)
{ {
if (st->sp == 0) { if (st->sp == 0) {
signal_error(st, "stack underflow"); signal_error(st, "stack underflow");
return Nil; return false;
} }
return st->data_stack[st->sp - 1]; *val = st->data_stack[st->sp - 1];
return true;
} }
Value Value
pop_val(RpnState *st) pop_val(RpnState *st)
{ {
Value val = top_val(st); Value val;
if (val.kind == VAL_NIL) if (!top_val(st, &val))
return Nil; return Nil;
--st->sp; --st->sp;
return val; return val;
@ -256,7 +257,9 @@ not_nat(RpnState *st)
void void
dup_nat(RpnState *st) dup_nat(RpnState *st)
{ {
push_val(st, top_val(st)); Value val;
top_val(st, &val);
push_val(st, val);
} }
void void
@ -430,6 +433,14 @@ to_number_nat(RpnState *st)
push_val(st, BOX_INTN(n)); push_val(st, BOX_INTN(n));
} }
void
parse_word_nat(RpnState *st)
{
skip_whitespace(&st->rsp, st->rep);
Str wn = read_word_name(&st->rsp, st->rep);
push_val(st, BOX_STR(wn));
}
void void
add_word(RpnState *st, Word *w) add_word(RpnState *st, Word *w)
{ {
@ -623,6 +634,7 @@ main(int argc, char **argv)
{.name = Sl(";"), .kind = WORD_NATIVE, .nat = compile_end_nat }, {.name = Sl(";"), .kind = WORD_NATIVE, .nat = compile_end_nat },
{.name = Sl("'"), .kind = WORD_NATIVE, .nat = tick_nat }, {.name = Sl("'"), .kind = WORD_NATIVE, .nat = tick_nat },
{.name = Sl(">#"), .kind = WORD_NATIVE, .nat = to_number_nat }, {.name = Sl(">#"), .kind = WORD_NATIVE, .nat = to_number_nat },
{.name = Sl("parse-word"), .kind = WORD_NATIVE, .nat = parse_word_nat },
{.name = Sl("exec"), .kind = WORD_NATIVE, .nat = exec_nat}, {.name = Sl("exec"), .kind = WORD_NATIVE, .nat = exec_nat},
{.name = Sl("eval"), .kind = WORD_NATIVE, .nat = eval_nat}, {.name = Sl("eval"), .kind = WORD_NATIVE, .nat = eval_nat},
{.name = Sl("dup"), .kind = WORD_NATIVE, .nat = dup_nat }, {.name = Sl("dup"), .kind = WORD_NATIVE, .nat = dup_nat },