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;
}
Value
top_val(RpnState *st)
bool
top_val(RpnState *st, Value *val)
{
if (st->sp == 0) {
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
pop_val(RpnState *st)
{
Value val = top_val(st);
if (val.kind == VAL_NIL)
Value val;
if (!top_val(st, &val))
return Nil;
--st->sp;
return val;
@ -256,7 +257,9 @@ not_nat(RpnState *st)
void
dup_nat(RpnState *st)
{
push_val(st, top_val(st));
Value val;
top_val(st, &val);
push_val(st, val);
}
void
@ -430,6 +433,14 @@ to_number_nat(RpnState *st)
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
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 = tick_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("eval"), .kind = WORD_NATIVE, .nat = eval_nat},
{.name = Sl("dup"), .kind = WORD_NATIVE, .nat = dup_nat },