pass a temporary arena allocator to the continuation in h_bind
This commit is contained in:
parent
7ba5931095
commit
1ce0ef9b8a
3 changed files with 51 additions and 10 deletions
|
|
@ -4,8 +4,34 @@ typedef struct {
|
|||
const HParser *p;
|
||||
HContinuation k;
|
||||
void *env;
|
||||
HAllocator *mm__;
|
||||
} BindEnv;
|
||||
|
||||
// an HAllocator backed by an HArena
|
||||
typedef struct {
|
||||
HAllocator allocator; // inherit XXX is this the proper way to do it?
|
||||
HArena *arena;
|
||||
} ArenaAllocator;
|
||||
|
||||
void *aa_alloc(HAllocator *allocator, size_t size)
|
||||
{
|
||||
HArena *arena = ((ArenaAllocator *)allocator)->arena;
|
||||
return h_arena_malloc(arena, size);
|
||||
}
|
||||
|
||||
void *aa_realloc(HAllocator *allocator, void *ptr, size_t size)
|
||||
{
|
||||
HArena *arena = ((ArenaAllocator *)allocator)->arena;
|
||||
assert(0); // XXX realloc for arena allocator
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void aa_free(HAllocator *allocator, void *ptr)
|
||||
{
|
||||
HArena *arena = ((ArenaAllocator *)allocator)->arena;
|
||||
h_arena_free(arena, ptr);
|
||||
}
|
||||
|
||||
static HParseResult *parse_bind(void *be_, HParseState *state) {
|
||||
BindEnv *be = be_;
|
||||
|
||||
|
|
@ -13,11 +39,20 @@ static HParseResult *parse_bind(void *be_, HParseState *state) {
|
|||
if(!res)
|
||||
return NULL;
|
||||
|
||||
HParser *kx = be->k(res->ast, be->env);
|
||||
if(!kx)
|
||||
return NULL;
|
||||
// create a temporary arena allocator for the continuation
|
||||
HArena *arena = h_new_arena(be->mm__, 0);
|
||||
ArenaAllocator aa = {{aa_alloc, aa_realloc, aa_free}, arena};
|
||||
|
||||
return h_do_parse(kx, state);
|
||||
HParser *kx = be->k((HAllocator *)&aa, res->ast, be->env);
|
||||
if(!kx) {
|
||||
h_delete_arena(arena);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = h_do_parse(kx, state);
|
||||
|
||||
h_delete_arena(arena);
|
||||
return res;
|
||||
}
|
||||
|
||||
static const HParserVtable bind_vt = {
|
||||
|
|
@ -40,6 +75,7 @@ HParser *h_bind__m(HAllocator *mm__,
|
|||
be->p = p;
|
||||
be->k = k;
|
||||
be->env = env;
|
||||
be->mm__ = mm__;
|
||||
|
||||
return h_new_parser(mm__, &bind_vt, be);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue