tear off contexts when invoking a continuation

This commit is contained in:
Yuichi Nishiwaki 2017-04-01 17:32:36 +09:00
parent 7d47d56b9c
commit b3aaee6e3a
3 changed files with 44 additions and 40 deletions

View File

@ -44,6 +44,8 @@ pic_save_point(pic_state *pic, struct cont *cont, PIC_JMPBUF *jmp)
void void
pic_load_point(pic_state *pic, struct cont *cont) pic_load_point(pic_state *pic, struct cont *cont)
{ {
pic_vm_tear_off(pic);
/* load runtime context */ /* load runtime context */
pic->sp = pic->stbase + cont->sp_offset; pic->sp = pic->stbase + cont->sp_offset;
pic->ci = pic->cibase + cont->ci_offset; pic->ci = pic->cibase + cont->ci_offset;

View File

@ -74,6 +74,8 @@ void pic_heap_close(pic_state *, struct heap *);
pic_value pic_global_ref(pic_state *pic, pic_value uid); pic_value pic_global_ref(pic_state *pic, pic_value uid);
void pic_global_set(pic_state *pic, pic_value uid, pic_value value); void pic_global_set(pic_state *pic, pic_value uid, pic_value value);
void pic_vm_tear_off(pic_state *pic);
#if defined(__cplusplus) #if defined(__cplusplus)
} }
#endif #endif

View File

@ -10,46 +10,46 @@ extern "C" {
#endif #endif
enum { enum {
OP_NOP, OP_NOP = 0,
OP_POP, OP_POP = 1,
OP_PUSHUNDEF, OP_PUSHUNDEF = 2,
OP_PUSHNIL, OP_PUSHNIL = 3,
OP_PUSHTRUE, OP_PUSHTRUE = 4,
OP_PUSHFALSE, OP_PUSHFALSE = 5,
OP_PUSHINT, OP_PUSHINT = 6,
OP_PUSHFLOAT, OP_PUSHFLOAT = 7,
OP_PUSHCHAR, OP_PUSHCHAR = 8,
OP_PUSHEOF, OP_PUSHEOF = 9,
OP_PUSHCONST, OP_PUSHCONST = 10,
OP_GREF, OP_GREF = 11,
OP_GSET, OP_GSET = 12,
OP_LREF, OP_LREF = 13,
OP_LSET, OP_LSET = 14,
OP_CREF, OP_CREF = 15,
OP_CSET, OP_CSET = 16,
OP_JMP, OP_JMP = 17,
OP_JMPIF, OP_JMPIF = 18,
OP_NOT, OP_NOT = 19,
OP_CALL, OP_CALL = 20,
OP_TAILCALL, OP_TAILCALL = 21,
OP_RET, OP_RET = 22,
OP_LAMBDA, OP_LAMBDA = 23,
OP_CONS, OP_CONS = 24,
OP_CAR, OP_CAR = 25,
OP_CDR, OP_CDR = 26,
OP_NILP, OP_NILP = 27,
OP_SYMBOLP, OP_SYMBOLP = 28,
OP_PAIRP, OP_PAIRP = 29,
OP_ADD, OP_ADD = 30,
OP_SUB, OP_SUB = 31,
OP_MUL, OP_MUL = 32,
OP_DIV, OP_DIV = 33,
OP_EQ, OP_EQ = 34,
OP_LT, OP_LT = 35,
OP_LE, OP_LE = 36,
OP_GT, OP_GT = 37,
OP_GE, OP_GE = 38,
OP_STOP OP_STOP = 39
}; };
#if defined(__cplusplus) #if defined(__cplusplus)