stateful allocator

This commit is contained in:
Yuichi Nishiwaki 2015-08-10 21:13:23 +09:00
parent 50dce97bac
commit c573f2c56e
3 changed files with 21 additions and 21 deletions

View File

@ -81,7 +81,7 @@ pic_heap_close(pic_state *pic, struct pic_heap *heap)
#if PIC_ENABLE_LIBC #if PIC_ENABLE_LIBC
void * void *
pic_default_allocf(void *ptr, size_t size) pic_default_allocf(void PIC_UNUSED(*userdata), void *ptr, size_t size)
{ {
if (size == 0) { if (size == 0) {
if (ptr) { if (ptr) {
@ -102,7 +102,7 @@ pic_malloc(pic_state *pic, size_t size)
{ {
void *ptr; void *ptr;
ptr = pic->allocf(NULL, size); ptr = pic->allocf(pic->userdata, NULL, size);
if (ptr == NULL && size > 0) { if (ptr == NULL && size > 0) {
pic_panic(pic, "memory exhausted"); pic_panic(pic, "memory exhausted");
} }
@ -112,7 +112,7 @@ pic_malloc(pic_state *pic, size_t size)
void * void *
pic_realloc(pic_state *pic, void *ptr, size_t size) pic_realloc(pic_state *pic, void *ptr, size_t size)
{ {
ptr = pic->allocf(ptr, size); ptr = pic->allocf(pic->userdata, ptr, size);
if (ptr == NULL && size > 0) { if (ptr == NULL && size > 0) {
pic_panic(pic, "memory exhausted"); pic_panic(pic, "memory exhausted");
} }
@ -125,7 +125,7 @@ pic_calloc(pic_state *pic, size_t count, size_t size)
void *ptr; void *ptr;
size *= count; size *= count;
ptr = pic->allocf(NULL, size); ptr = pic->allocf(pic->userdata, NULL, size);
if (ptr == NULL && size > 0) { if (ptr == NULL && size > 0) {
pic_panic(pic, "memory exhausted"); pic_panic(pic, "memory exhausted");
} }
@ -136,7 +136,7 @@ pic_calloc(pic_state *pic, size_t count, size_t size)
void void
pic_free(pic_state *pic, void *ptr) pic_free(pic_state *pic, void *ptr)
{ {
pic->allocf(ptr, 0); pic->allocf(pic->userdata, ptr, 0);
} }
static void static void

View File

@ -67,7 +67,7 @@ typedef struct {
struct pic_context *up; struct pic_context *up;
} pic_callinfo; } pic_callinfo;
typedef void *(*pic_allocf)(void *, size_t); typedef void *(*pic_allocf)(void *, void *, size_t);
struct pic_state { struct pic_state {
int argc; int argc;
@ -158,7 +158,7 @@ void pic_gc_arena_restore(pic_state *, size_t);
pic_gc_arena_restore(pic, ai); \ pic_gc_arena_restore(pic, ai); \
} while (0) } while (0)
void *pic_default_allocf(void *, size_t); void *pic_default_allocf(void *, void *, size_t);
pic_state *pic_open(pic_allocf, void *); pic_state *pic_open(pic_allocf, void *);
void pic_close(pic_state *); void pic_close(pic_state *);
void pic_set_argv(pic_state *, int argc, char *argv[], char **envp); void pic_set_argv(pic_state *, int argc, char *argv[], char **envp);

View File

@ -237,7 +237,7 @@ pic_open(pic_allocf allocf, void *userdata)
pic_state *pic; pic_state *pic;
size_t ai; size_t ai;
pic = allocf(NULL, sizeof(pic_state)); pic = allocf(userdata, NULL, sizeof(pic_state));
if (! pic) { if (! pic) {
goto EXIT_PIC; goto EXIT_PIC;
@ -265,7 +265,7 @@ pic_open(pic_allocf allocf, void *userdata)
pic->envp = NULL; pic->envp = NULL;
/* prepare VM stack */ /* prepare VM stack */
pic->stbase = pic->sp = allocf(NULL, PIC_STACK_SIZE * sizeof(pic_value)); pic->stbase = pic->sp = allocf(userdata, NULL, PIC_STACK_SIZE * sizeof(pic_value));
pic->stend = pic->stbase + PIC_STACK_SIZE; pic->stend = pic->stbase + PIC_STACK_SIZE;
if (! pic->sp) { if (! pic->sp) {
@ -273,7 +273,7 @@ pic_open(pic_allocf allocf, void *userdata)
} }
/* callinfo */ /* callinfo */
pic->cibase = pic->ci = allocf(NULL, PIC_STACK_SIZE * sizeof(pic_callinfo)); pic->cibase = pic->ci = allocf(userdata, NULL, PIC_STACK_SIZE * sizeof(pic_callinfo));
pic->ciend = pic->cibase + PIC_STACK_SIZE; pic->ciend = pic->cibase + PIC_STACK_SIZE;
if (! pic->ci) { if (! pic->ci) {
@ -281,7 +281,7 @@ pic_open(pic_allocf allocf, void *userdata)
} }
/* exception handler */ /* exception handler */
pic->xpbase = pic->xp = allocf(NULL, PIC_RESCUE_SIZE * sizeof(struct pic_proc *)); pic->xpbase = pic->xp = allocf(userdata, NULL, PIC_RESCUE_SIZE * sizeof(struct pic_proc *));
pic->xpend = pic->xpbase + PIC_RESCUE_SIZE; pic->xpend = pic->xpbase + PIC_RESCUE_SIZE;
if (! pic->xp) { if (! pic->xp) {
@ -289,7 +289,7 @@ pic_open(pic_allocf allocf, void *userdata)
} }
/* GC arena */ /* GC arena */
pic->arena = allocf(NULL, PIC_ARENA_SIZE * sizeof(struct pic_object *)); pic->arena = allocf(userdata, NULL, PIC_ARENA_SIZE * sizeof(struct pic_object *));
pic->arena_size = PIC_ARENA_SIZE; pic->arena_size = PIC_ARENA_SIZE;
pic->arena_idx = 0; pic->arena_idx = 0;
@ -458,13 +458,13 @@ pic_open(pic_allocf allocf, void *userdata)
return pic; return pic;
EXIT_ARENA: EXIT_ARENA:
allocf(pic->xp, 0); allocf(userdata, pic->xp, 0);
EXIT_XP: EXIT_XP:
allocf(pic->ci, 0); allocf(userdata, pic->ci, 0);
EXIT_CI: EXIT_CI:
allocf(pic->sp, 0); allocf(userdata, pic->sp, 0);
EXIT_SP: EXIT_SP:
allocf(pic, 0); allocf(userdata, pic, 0);
EXIT_PIC: EXIT_PIC:
return NULL; return NULL;
} }
@ -500,15 +500,15 @@ pic_close(pic_state *pic)
pic_reader_destroy(pic); pic_reader_destroy(pic);
/* free runtime context */ /* free runtime context */
allocf(pic->stbase, 0); allocf(pic->userdata, pic->stbase, 0);
allocf(pic->cibase, 0); allocf(pic->userdata, pic->cibase, 0);
allocf(pic->xpbase, 0); allocf(pic->userdata, pic->xpbase, 0);
/* free global stacks */ /* free global stacks */
kh_destroy(s, h); kh_destroy(s, h);
/* free GC arena */ /* free GC arena */
allocf(pic->arena, 0); allocf(pic->userdata, pic->arena, 0);
allocf(pic, 0); allocf(pic->userdata, pic, 0);
} }