support 2-argument if syntax
This commit is contained in:
parent
759c9eb55c
commit
edd890ae0b
|
@ -262,9 +262,18 @@ codegen(codegen_state *state, pic_value obj)
|
||||||
}
|
}
|
||||||
else if (sym == pic->sIF) {
|
else if (sym == pic->sIF) {
|
||||||
int s,t;
|
int s,t;
|
||||||
|
pic_value if_true, if_false;
|
||||||
|
|
||||||
if (pic_length(pic, obj) != 4) {
|
if_false = pic_false_value();
|
||||||
|
switch (pic_length(pic, obj)) {
|
||||||
|
default:
|
||||||
pic_error(pic, "syntax error");
|
pic_error(pic, "syntax error");
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if_false = pic_car(pic, pic_cdr(pic, pic_cdr(pic, pic_cdr(pic, obj))));
|
||||||
|
FALLTHROUGH;
|
||||||
|
case 3:
|
||||||
|
if_true = pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj)));
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen(state, pic_car(pic, pic_cdr(pic, obj)));
|
codegen(state, pic_car(pic, pic_cdr(pic, obj)));
|
||||||
|
@ -273,14 +282,14 @@ codegen(codegen_state *state, pic_value obj)
|
||||||
s = irep->clen++;
|
s = irep->clen++;
|
||||||
|
|
||||||
/* if false branch */
|
/* if false branch */
|
||||||
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, pic_cdr(pic, obj)))));
|
codegen(state, if_false);
|
||||||
irep->code[irep->clen].insn = OP_JMP;
|
irep->code[irep->clen].insn = OP_JMP;
|
||||||
t = irep->clen++;
|
t = irep->clen++;
|
||||||
|
|
||||||
irep->code[s].u.i = irep->clen - s;
|
irep->code[s].u.i = irep->clen - s;
|
||||||
|
|
||||||
/* if true branch */
|
/* if true branch */
|
||||||
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))));
|
codegen(state, if_true);
|
||||||
irep->code[t].u.i = irep->clen - t;
|
irep->code[t].u.i = irep->clen - t;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue