allocate jmpbuf array in heap
This commit is contained in:
parent
2f44145d3e
commit
3cb46b9b79
|
@ -109,6 +109,7 @@ typedef struct {
|
|||
jmp_buf *jmp;
|
||||
struct pic_error *err;
|
||||
struct pic_jmpbuf *try_jmps;
|
||||
size_t try_jmp_size, try_jmp_idx;
|
||||
|
||||
struct pic_heap *heap;
|
||||
struct pic_object **arena;
|
||||
|
|
|
@ -30,6 +30,9 @@ struct pic_cont {
|
|||
size_t arena_size;
|
||||
int arena_idx;
|
||||
|
||||
struct pic_jmpbuf *try_jmps;
|
||||
size_t try_jmp_idx, try_jmp_size;
|
||||
|
||||
pic_value results;
|
||||
};
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@ struct pic_jmpbuf {
|
|||
pic_value *sp;
|
||||
pic_code *ip;
|
||||
jmp_buf *prev_jmp;
|
||||
struct pic_jmpbuf *prev;
|
||||
};
|
||||
|
||||
/* do not return from try block! */
|
||||
|
|
11
src/cont.c
11
src/cont.c
|
@ -10,6 +10,7 @@
|
|||
#include "picrin/proc.h"
|
||||
#include "picrin/cont.h"
|
||||
#include "picrin/pair.h"
|
||||
#include "picrin/error.h"
|
||||
|
||||
pic_value
|
||||
pic_values0(pic_state *pic)
|
||||
|
@ -143,6 +144,11 @@ save_cont(pic_state *pic, struct pic_cont **c)
|
|||
cont->arena = (struct pic_object **)pic_alloc(pic, sizeof(struct pic_object *) * pic->arena_size);
|
||||
memcpy(cont->arena, pic->arena, sizeof(struct pic_object *) * pic->arena_size);
|
||||
|
||||
cont->try_jmp_idx = pic->try_jmp_idx;
|
||||
cont->try_jmp_size = pic->try_jmp_size;
|
||||
cont->try_jmps = pic_alloc(pic, sizeof(struct pic_jmpbuf) * pic->try_jmp_size);
|
||||
memcpy(cont->try_jmps, pic->try_jmps, sizeof(struct pic_jmpbuf) * pic->try_jmp_size);
|
||||
|
||||
cont->results = pic_undef_value();
|
||||
}
|
||||
|
||||
|
@ -189,6 +195,11 @@ restore_cont(pic_state *pic, struct pic_cont *cont)
|
|||
pic->arena_size = cont->arena_size;
|
||||
pic->arena_idx = cont->arena_idx;
|
||||
|
||||
pic->try_jmps = pic_realloc(pic, pic->try_jmps, sizeof(struct pic_jmpbuf) * cont->try_jmp_size);
|
||||
memcpy(pic->try_jmps, cont->try_jmps, sizeof(struct pic_jmpbuf) * cont->try_jmp_size);
|
||||
pic->try_jmp_size = cont->try_jmp_size;
|
||||
pic->try_jmp_idx = cont->try_jmp_idx;
|
||||
|
||||
memcpy(cont->stk_pos, cont->stk_ptr, cont->stk_len);
|
||||
|
||||
longjmp(tmp->jmp, 1);
|
||||
|
|
21
src/error.c
21
src/error.c
|
@ -38,7 +38,7 @@ pic_push_try(pic_state *pic)
|
|||
{
|
||||
struct pic_jmpbuf *try_jmp;
|
||||
|
||||
try_jmp = pic_alloc(pic, sizeof(struct pic_jmpbuf));
|
||||
try_jmp = pic->try_jmps + pic->try_jmp_idx++;
|
||||
|
||||
try_jmp->ci = pic->ci;
|
||||
try_jmp->sp = pic->sp;
|
||||
|
@ -46,27 +46,22 @@ pic_push_try(pic_state *pic)
|
|||
|
||||
try_jmp->prev_jmp = pic->jmp;
|
||||
pic->jmp = &try_jmp->here;
|
||||
|
||||
try_jmp->prev = pic->try_jmps;
|
||||
pic->try_jmps = try_jmp;
|
||||
}
|
||||
|
||||
void
|
||||
pic_pop_try(pic_state *pic)
|
||||
{
|
||||
struct pic_jmpbuf *prev;
|
||||
struct pic_jmpbuf *try_jmp;
|
||||
|
||||
assert(pic->jmp == &pic->try_jmps->here);
|
||||
try_jmp = pic->try_jmps + --pic->try_jmp_idx;
|
||||
|
||||
pic->ci = pic->try_jmps->ci;
|
||||
pic->sp = pic->try_jmps->sp;
|
||||
pic->ip = pic->try_jmps->ip;
|
||||
assert(pic->jmp == &try_jmp->here);
|
||||
|
||||
pic->jmp = pic->try_jmps->prev_jmp;
|
||||
pic->ci = try_jmp->ci;
|
||||
pic->sp = try_jmp->sp;
|
||||
pic->ip = try_jmp->ip;
|
||||
|
||||
prev = pic->try_jmps->prev;
|
||||
pic_free(pic, pic->try_jmps);
|
||||
pic->try_jmps = prev;
|
||||
pic->jmp = try_jmp->prev_jmp;
|
||||
}
|
||||
|
||||
static struct pic_error *
|
||||
|
|
1
src/gc.c
1
src/gc.c
|
@ -621,6 +621,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
|
|||
pic_free(pic, cont->st_ptr);
|
||||
pic_free(pic, cont->ci_ptr);
|
||||
pic_free(pic, cont->arena);
|
||||
pic_free(pic, cont->try_jmps);
|
||||
PIC_BLK_DECREF(pic, cont->blk);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "picrin/proc.h"
|
||||
#include "picrin/macro.h"
|
||||
#include "picrin/cont.h"
|
||||
#include "picrin/error.h"
|
||||
|
||||
void pic_init_core(pic_state *);
|
||||
|
||||
|
@ -70,7 +71,9 @@ pic_open(int argc, char *argv[], char **envp)
|
|||
/* error handling */
|
||||
pic->jmp = NULL;
|
||||
pic->err = NULL;
|
||||
pic->try_jmps = NULL;
|
||||
pic->try_jmps = calloc(PIC_RESCUE_SIZE, sizeof(struct pic_jmpbuf));
|
||||
pic->try_jmp_idx = 0;
|
||||
pic->try_jmp_size = PIC_RESCUE_SIZE;
|
||||
|
||||
/* GC arena */
|
||||
pic->arena = (struct pic_object **)calloc(PIC_ARENA_SIZE, sizeof(struct pic_object **));
|
||||
|
@ -170,6 +173,7 @@ pic_close(pic_state *pic)
|
|||
|
||||
/* free global stacks */
|
||||
free(pic->globals);
|
||||
free(pic->try_jmps);
|
||||
xh_destroy(&pic->syms);
|
||||
xh_destroy(&pic->global_tbl);
|
||||
xh_destroy(&pic->macros);
|
||||
|
|
Loading…
Reference in New Issue