remove struct pic_picjmp

This commit is contained in:
Yuichi Nishiwaki
2015-06-23 03:14:00 +09:00
parent 8932dbddd6
commit aae1b8792a
7 changed files with 36 additions and 40 deletions
+16 -17
View File
@@ -51,9 +51,6 @@ pic_dynamic_wind(pic_state *pic, struct pic_proc *in, struct pic_proc *thunk, st
void
pic_save_point(pic_state *pic, struct pic_cont *cont)
{
cont->jmp.prev = pic->jmp;
pic->jmp = &cont->jmp;
/* save runtime context */
cont->cp = pic->cp;
cont->sp_offset = pic->sp - pic->stbase;
@@ -62,21 +59,23 @@ pic_save_point(pic_state *pic, struct pic_cont *cont)
cont->arena_idx = pic->arena_idx;
cont->ip = pic->ip;
cont->ptable = pic->ptable;
cont->prev = pic->cc;
cont->results = pic_undef_value();
pic->cc = cont;
}
void
pic_load_point(pic_state *pic, struct pic_cont *cont)
{
pic_jmpbuf *jmp;
struct pic_cont *cc;
for (jmp = pic->jmp; jmp != NULL; jmp = jmp->prev) {
if (jmp == &cont->jmp) {
for (cc = pic->cc; cc != NULL; cc = cc->prev) {
if (cc == cont) {
break;
}
}
if (jmp == NULL) {
if (cc == NULL) {
pic_errorf(pic, "calling dead escape continuation");
}
@@ -106,7 +105,7 @@ cont_call(pic_state *pic)
pic_load_point(pic, e->data);
PIC_LONGJMP(pic, ((struct pic_cont *)e->data)->jmp.buf, 1);
PIC_LONGJMP(pic, ((struct pic_cont *)e->data)->jmp, 1);
PIC_UNREACHABLE();
}
@@ -114,7 +113,7 @@ cont_call(pic_state *pic)
struct pic_proc *
pic_make_cont(pic_state *pic, struct pic_cont *cont)
{
static const pic_data_type cont_type = { "cont", pic_free, NULL };
static const pic_data_type cont_type = { "cont", NULL, NULL };
struct pic_proc *c;
struct pic_data *e;
@@ -131,21 +130,21 @@ pic_make_cont(pic_state *pic, struct pic_cont *cont)
pic_value
pic_callcc(pic_state *pic, struct pic_proc *proc)
{
struct pic_cont *cont = pic_malloc(pic, sizeof(struct pic_cont));
struct pic_cont cont;
pic_save_point(pic, cont);
pic_save_point(pic, &cont);
if (PIC_SETJMP(pic, cont->jmp.buf)) {
pic->jmp = pic->jmp->prev;
if (PIC_SETJMP(pic, cont.jmp)) {
pic->cc = pic->cc->prev;
return pic_values_by_list(pic, cont->results);
return pic_values_by_list(pic, cont.results);
}
else {
pic_value val;
val = pic_apply1(pic, proc, pic_obj_value(pic_make_cont(pic, cont)));
val = pic_apply1(pic, proc, pic_obj_value(pic_make_cont(pic, &cont)));
pic->jmp = pic->jmp->prev;
pic->cc = pic->cc->prev;
return val;
}
+3 -1
View File
@@ -702,7 +702,9 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
}
case PIC_TT_DATA: {
struct pic_data *data = (struct pic_data *)obj;
data->type->dtor(pic, data->data);
if (data->type->dtor) {
data->type->dtor(pic, data->data);
}
xh_destroy(&data->storage);
break;
}
+1 -6
View File
@@ -47,11 +47,6 @@ typedef struct pic_state pic_state;
#include "picrin/read.h"
#include "picrin/gc.h"
typedef struct pic_jmpbuf {
PIC_JMPBUF buf;
struct pic_jmpbuf *prev;
} pic_jmpbuf;
typedef struct pic_checkpoint {
PIC_OBJECT_HEADER
struct pic_proc *in;
@@ -78,7 +73,7 @@ struct pic_state {
pic_allocf allocf;
pic_jmpbuf *jmp;
struct pic_cont *cc;
pic_checkpoint *cp;
pic_value *sp;
+4 -3
View File
@@ -10,7 +10,7 @@ extern "C" {
#endif
struct pic_cont {
pic_jmpbuf jmp;
PIC_JMPBUF jmp;
pic_checkpoint *cp;
@@ -18,12 +18,13 @@ struct pic_cont {
ptrdiff_t ci_offset;
ptrdiff_t xp_offset;
size_t arena_idx;
pic_value ptable;
pic_code *ip;
pic_value ptable;
pic_value results;
struct pic_cont *prev;
};
void pic_save_point(pic_state *, struct pic_cont *);
+7 -7
View File
@@ -30,21 +30,21 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list)
pic_catch_(PIC_GENSYM(label))
#define pic_try_(cont, handler) \
do { \
struct pic_cont *cont = pic_malloc(pic, sizeof(struct pic_cont)); \
pic_save_point(pic, cont); \
if (PIC_SETJMP(pic, cont->jmp.buf) == 0) { \
struct pic_cont cont; \
pic_save_point(pic, &cont); \
if (PIC_SETJMP(pic, cont.jmp) == 0) { \
extern pic_value pic_native_exception_handler(pic_state *); \
struct pic_proc *handler; \
handler = pic_make_proc(pic, pic_native_exception_handler, "(native-exception-handler)"); \
pic_proc_env_set(pic, handler, "cont", pic_obj_value(pic_make_cont(pic, cont))); \
pic_proc_env_set(pic, handler, "cont", pic_obj_value(pic_make_cont(pic, &cont))); \
do { \
pic_push_handler(pic, handler);
#define pic_catch_(label) \
pic_pop_handler(pic); \
pic_pop_handler(pic); \
} while (0); \
pic->jmp = pic->jmp->prev; \
pic->cc = pic->cc->prev; \
} else { \
pic->jmp = pic->jmp->prev; \
pic->cc = pic->cc->prev; \
goto label; \
} \
} while (0); \
+2 -2
View File
@@ -172,8 +172,8 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf)
/* turn off GC */
pic->gc_enable = false;
/* jmp */
pic->jmp = NULL;
/* continuation chain */
pic->cc = NULL;
/* root block */
pic->cp = NULL;