replace big VM loop stuff with macros
This commit is contained in:
parent
3eefa2669f
commit
38858e7a11
48
src/vm.c
48
src/vm.c
|
@ -1,4 +1,5 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
|
|
||||||
|
@ -145,6 +146,11 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *en
|
||||||
irep->clen++;
|
irep->clen++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PIC_TT_UNDEF: {
|
||||||
|
irep->code[irep->clen].insn = OP_PUSHUNDEF;
|
||||||
|
irep->clen++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,6 +175,12 @@ pic_codegen(pic_state *pic, pic_value obj, struct pic_env *env)
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VM_LOOP for (;;) { switch (pc->insn) {
|
||||||
|
#define CASE(x) case x:
|
||||||
|
#define NEXT pc++; break
|
||||||
|
#define JUMP break
|
||||||
|
#define VM_LOOP_END } }
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
{
|
{
|
||||||
|
@ -178,47 +190,45 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
pc = proc->u.irep->code;
|
pc = proc->u.irep->code;
|
||||||
sp = pic->sp;
|
sp = pic->sp;
|
||||||
|
|
||||||
while (1) {
|
VM_LOOP {
|
||||||
switch (pc->insn) {
|
CASE(OP_PUSHNIL) {
|
||||||
case OP_PUSHNIL: {
|
|
||||||
*++sp = pic_nil_value();
|
*++sp = pic_nil_value();
|
||||||
break;
|
NEXT;
|
||||||
}
|
}
|
||||||
case OP_PUSHI: {
|
CASE(OP_PUSHI) {
|
||||||
*++sp = pic_int_value(pc->u.i);
|
*++sp = pic_int_value(pc->u.i);
|
||||||
break;
|
NEXT;
|
||||||
}
|
}
|
||||||
case OP_PUSHUNDEF: {
|
CASE(OP_PUSHUNDEF) {
|
||||||
*++sp = pic_undef_value();
|
*++sp = pic_undef_value();
|
||||||
break;
|
NEXT;
|
||||||
}
|
}
|
||||||
case OP_GREF: {
|
CASE(OP_GREF) {
|
||||||
*++sp = pc->u.gvar->cdr;
|
*++sp = pc->u.gvar->cdr;
|
||||||
break;
|
NEXT;
|
||||||
}
|
}
|
||||||
case OP_GSET: {
|
CASE(OP_GSET) {
|
||||||
pc->u.gvar->cdr = *sp--;
|
pc->u.gvar->cdr = *sp--;
|
||||||
break;
|
NEXT;
|
||||||
}
|
}
|
||||||
case OP_CONS: {
|
CASE(OP_CONS) {
|
||||||
pic_value a, b;
|
pic_value a, b;
|
||||||
a = *sp--;
|
a = *sp--;
|
||||||
b = *sp--;
|
b = *sp--;
|
||||||
*++sp = pic_cons(pic, a, b);
|
*++sp = pic_cons(pic, a, b);
|
||||||
break;
|
NEXT;
|
||||||
}
|
}
|
||||||
case OP_ADD: {
|
CASE(OP_ADD) {
|
||||||
pic_value a, b;
|
pic_value a, b;
|
||||||
a = *sp--;
|
a = *sp--;
|
||||||
b = *sp--;
|
b = *sp--;
|
||||||
*++sp = pic_int_value(pic_int(a) + pic_int(b));
|
*++sp = pic_int_value(pic_int(a) + pic_int(b));
|
||||||
break;
|
NEXT;
|
||||||
}
|
}
|
||||||
case OP_STOP:
|
CASE(OP_STOP) {
|
||||||
goto STOP;
|
goto STOP;
|
||||||
}
|
}
|
||||||
pc++;
|
} VM_LOOP_END;
|
||||||
}
|
|
||||||
|
|
||||||
STOP:
|
STOP:
|
||||||
return *sp;
|
return *sp;
|
||||||
|
|
Loading…
Reference in New Issue