fix pop-ing of nil values
This commit is contained in:
parent
399ef3ab48
commit
bf608ad103
1 changed files with 19 additions and 7 deletions
26
pila.c
26
pila.c
|
@ -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 },
|
||||
|
|
Loading…
Add table
Reference in a new issue