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;
|
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 },
|
||||||
|
|
Loading…
Add table
Reference in a new issue