diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 51df8c0c..987124d2 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -3,6 +3,7 @@ */ #include "picrin.h" +#include "picrin/opcode.h" /** * macro expander diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index bcaf4eb6..aa230848 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -9,49 +9,8 @@ extern "C" { #endif -enum pic_opcode { - OP_NOP, - OP_POP, - OP_PUSHUNDEF, - OP_PUSHNIL, - OP_PUSHTRUE, - OP_PUSHFALSE, - OP_PUSHINT, - OP_PUSHCHAR, - OP_PUSHCONST, - OP_GREF, - OP_GSET, - OP_LREF, - OP_LSET, - OP_CREF, - OP_CSET, - OP_JMP, - OP_JMPIF, - OP_NOT, - OP_CALL, - OP_TAILCALL, - OP_RET, - OP_LAMBDA, - OP_CONS, - OP_CAR, - OP_CDR, - OP_NILP, - OP_SYMBOLP, - OP_PAIRP, - OP_ADD, - OP_SUB, - OP_MUL, - OP_DIV, - OP_EQ, - OP_LT, - OP_LE, - OP_GT, - OP_GE, - OP_STOP -}; - typedef struct { - enum pic_opcode insn; + int insn; union { int i; char c; @@ -62,11 +21,6 @@ typedef struct { } u; } pic_code; -#define PIC_INIT_CODE_I(code, op, ival) do { \ - code.insn = op; \ - code.u.i = ival; \ - } while (0) - struct pic_irep { PIC_OBJECT_HEADER pic_code *code; @@ -82,149 +36,6 @@ pic_value pic_expand(pic_state *, pic_value, struct pic_env *); pic_value pic_analyze(pic_state *, pic_value); struct pic_irep *pic_codegen(pic_state *, pic_value); -#if DEBUG - -PIC_INLINE void -pic_dump_code(pic_code c) -{ - printf("[%2d] ", c.insn); - switch (c.insn) { - case OP_NOP: - puts("OP_NOP"); - break; - case OP_POP: - puts("OP_POP"); - break; - case OP_PUSHUNDEF: - puts("OP_PUSHUNDEF"); - break; - case OP_PUSHNIL: - puts("OP_PUSHNIL"); - break; - case OP_PUSHTRUE: - puts("OP_PUSHTRUE"); - break; - case OP_PUSHFALSE: - puts("OP_PUSHFALSE"); - break; - case OP_PUSHINT: - printf("OP_PUSHINT\t%d\n", c.u.i); - break; - case OP_PUSHCHAR: - printf("OP_PUSHCHAR\t%c\n", c.u.c); - break; - case OP_PUSHCONST: - printf("OP_PUSHCONST\t%d\n", c.u.i); - break; - case OP_GREF: - printf("OP_GREF\t%i\n", c.u.i); - break; - case OP_GSET: - printf("OP_GSET\t%i\n", c.u.i); - break; - case OP_LREF: - printf("OP_LREF\t%d\n", c.u.i); - break; - case OP_LSET: - printf("OP_LSET\t%d\n", c.u.i); - break; - case OP_CREF: - printf("OP_CREF\t%d\t%d\n", c.u.r.depth, c.u.r.idx); - break; - case OP_CSET: - printf("OP_CSET\t%d\t%d\n", c.u.r.depth, c.u.r.idx); - break; - case OP_JMP: - printf("OP_JMP\t%x\n", c.u.i); - break; - case OP_JMPIF: - printf("OP_JMPIF\t%x\n", c.u.i); - break; - case OP_NOT: - puts("OP_NOT"); - break; - case OP_CALL: - printf("OP_CALL\t%d\n", c.u.i); - break; - case OP_TAILCALL: - printf("OP_TAILCALL\t%d\n", c.u.i); - break; - case OP_RET: - puts("OP_RET"); - break; - case OP_LAMBDA: - printf("OP_LAMBDA\t%d\n", c.u.i); - break; - case OP_CONS: - puts("OP_CONS"); - break; - case OP_CAR: - puts("OP_CAR"); - break; - case OP_NILP: - puts("OP_NILP"); - break; - case OP_SYMBOLP: - puts("OP_SYMBOLP"); - break; - case OP_PAIRP: - puts("OP_PAIRP"); - break; - case OP_CDR: - puts("OP_CDR"); - break; - case OP_ADD: - puts("OP_ADD"); - break; - case OP_SUB: - puts("OP_SUB"); - break; - case OP_MUL: - puts("OP_MUL"); - break; - case OP_DIV: - puts("OP_DIV"); - break; - case OP_EQ: - puts("OP_EQ"); - break; - case OP_LT: - puts("OP_LT"); - break; - case OP_LE: - puts("OP_LE"); - break; - case OP_GT: - puts("OP_GT"); - break; - case OP_GE: - puts("OP_GE"); - break; - case OP_STOP: - puts("OP_STOP"); - break; - } -} - -PIC_INLINE void -pic_dump_irep(struct pic_irep *irep) -{ - unsigned i; - - printf("## irep %p\n", (void *)irep); - printf("[clen = %zd, argc = %d, localc = %d, capturec = %d]\n", irep->clen, irep->argc, irep->localc, irep->capturec); - for (i = 0; i < irep->clen; ++i) { - printf("%02x ", i); - pic_dump_code(irep->code[i]); - } - - for (i = 0; i < irep->ilen; ++i) { - pic_dump_irep(irep->irep[i]); - } -} - -#endif - #if defined(__cplusplus) } #endif diff --git a/extlib/benz/include/picrin/opcode.h b/extlib/benz/include/picrin/opcode.h new file mode 100644 index 00000000..e3eb00a7 --- /dev/null +++ b/extlib/benz/include/picrin/opcode.h @@ -0,0 +1,205 @@ +/** + * See Copyright Notice in picrin.h + */ + +#ifndef PICRIN_OPCODE_H +#define PICRIN_OPCODE_H + +#if defined(__cplusplus) +extern "C" { +#endif + +enum pic_opcode { + OP_NOP, + OP_POP, + OP_PUSHUNDEF, + OP_PUSHNIL, + OP_PUSHTRUE, + OP_PUSHFALSE, + OP_PUSHINT, + OP_PUSHCHAR, + OP_PUSHCONST, + OP_GREF, + OP_GSET, + OP_LREF, + OP_LSET, + OP_CREF, + OP_CSET, + OP_JMP, + OP_JMPIF, + OP_NOT, + OP_CALL, + OP_TAILCALL, + OP_RET, + OP_LAMBDA, + OP_CONS, + OP_CAR, + OP_CDR, + OP_NILP, + OP_SYMBOLP, + OP_PAIRP, + OP_ADD, + OP_SUB, + OP_MUL, + OP_DIV, + OP_EQ, + OP_LT, + OP_LE, + OP_GT, + OP_GE, + OP_STOP +}; + +#define PIC_INIT_CODE_I(code, op, ival) do { \ + code.insn = op; \ + code.u.i = ival; \ + } while (0) + +#if DEBUG + +PIC_INLINE void +pic_dump_code(pic_code c) +{ + printf("[%2d] ", c.insn); + switch (c.insn) { + case OP_NOP: + puts("OP_NOP"); + break; + case OP_POP: + puts("OP_POP"); + break; + case OP_PUSHUNDEF: + puts("OP_PUSHUNDEF"); + break; + case OP_PUSHNIL: + puts("OP_PUSHNIL"); + break; + case OP_PUSHTRUE: + puts("OP_PUSHTRUE"); + break; + case OP_PUSHFALSE: + puts("OP_PUSHFALSE"); + break; + case OP_PUSHINT: + printf("OP_PUSHINT\t%d\n", c.u.i); + break; + case OP_PUSHCHAR: + printf("OP_PUSHCHAR\t%c\n", c.u.c); + break; + case OP_PUSHCONST: + printf("OP_PUSHCONST\t%d\n", c.u.i); + break; + case OP_GREF: + printf("OP_GREF\t%i\n", c.u.i); + break; + case OP_GSET: + printf("OP_GSET\t%i\n", c.u.i); + break; + case OP_LREF: + printf("OP_LREF\t%d\n", c.u.i); + break; + case OP_LSET: + printf("OP_LSET\t%d\n", c.u.i); + break; + case OP_CREF: + printf("OP_CREF\t%d\t%d\n", c.u.r.depth, c.u.r.idx); + break; + case OP_CSET: + printf("OP_CSET\t%d\t%d\n", c.u.r.depth, c.u.r.idx); + break; + case OP_JMP: + printf("OP_JMP\t%x\n", c.u.i); + break; + case OP_JMPIF: + printf("OP_JMPIF\t%x\n", c.u.i); + break; + case OP_NOT: + puts("OP_NOT"); + break; + case OP_CALL: + printf("OP_CALL\t%d\n", c.u.i); + break; + case OP_TAILCALL: + printf("OP_TAILCALL\t%d\n", c.u.i); + break; + case OP_RET: + puts("OP_RET"); + break; + case OP_LAMBDA: + printf("OP_LAMBDA\t%d\n", c.u.i); + break; + case OP_CONS: + puts("OP_CONS"); + break; + case OP_CAR: + puts("OP_CAR"); + break; + case OP_NILP: + puts("OP_NILP"); + break; + case OP_SYMBOLP: + puts("OP_SYMBOLP"); + break; + case OP_PAIRP: + puts("OP_PAIRP"); + break; + case OP_CDR: + puts("OP_CDR"); + break; + case OP_ADD: + puts("OP_ADD"); + break; + case OP_SUB: + puts("OP_SUB"); + break; + case OP_MUL: + puts("OP_MUL"); + break; + case OP_DIV: + puts("OP_DIV"); + break; + case OP_EQ: + puts("OP_EQ"); + break; + case OP_LT: + puts("OP_LT"); + break; + case OP_LE: + puts("OP_LE"); + break; + case OP_GT: + puts("OP_GT"); + break; + case OP_GE: + puts("OP_GE"); + break; + case OP_STOP: + puts("OP_STOP"); + break; + } +} + +PIC_INLINE void +pic_dump_irep(struct pic_irep *irep) +{ + unsigned i; + + printf("## irep %p\n", (void *)irep); + printf("[clen = %zd, argc = %d, localc = %d, capturec = %d]\n", irep->clen, irep->argc, irep->localc, irep->capturec); + for (i = 0; i < irep->clen; ++i) { + printf("%02x ", i); + pic_dump_code(irep->code[i]); + } + + for (i = 0; i < irep->ilen; ++i) { + pic_dump_irep(irep->irep[i]); + } +} + +#endif + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index ec63da8b..dd719d24 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -3,6 +3,7 @@ */ #include "picrin.h" +#include "picrin/opcode.h" #define GET_OPERAND(pic,n) ((pic)->ci->fp[(n)])