Mercurial > repos > rhope
view runtime/context.c @ 11:3021dac0d8f5
Stack unwind is so close I can almost taste it
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 19 May 2009 23:29:55 -0400 |
parents | 8d74ef7fa357 |
children | 31f8182f3433 |
line wrap: on
line source
#include "context.h" #include "object.h" #include <stdlib.h> #include <stddef.h> #include <stdio.h> stackchunk * new_stack() { stackchunk * st = malloc(sizeof(stackchunk)); st->prev = NULL; st->next = NULL; st->used = 0; return st; } context * new_context() { context * c = malloc(sizeof(context)); c->stack_begin = new_stack(); c->current_stack = c->stack_begin; c->unwind = NULL; return c; } void * alloc_stack(context * ct, uint32_t size) { void * ret; stackchunk * current = ct->current_stack; if(size > STACK_CHUNK_SIZE) return NULL; while(current && STACK_CHUNK_SIZE - current->used < size) { if(!current->next) current->next = new_stack(); current = current->next; } if(!current) return NULL; ct->current_stack = current; ret = current->data + current->used; current->used += size; return ret; } calldata * alloc_cdata(context * ct, uint32_t num_params) { calldata * out = alloc_stack(ct, sizeof(calldata)+(num_params-1)*sizeof(object *)); if(out) out->ct = ct; return out; } void free_stack(context * ct, void * data) { char * cdata = data; if(cdata < ct->current_stack->data || cdata >= ct->current_stack->data+STACK_CHUNK_SIZE) { fputs("Tried to free stack data from outside of current stack chunk!", stderr); exit(-1); } ct->current_stack->used = cdata-ct->current_stack->data; if(!ct->current_stack->used && ct->current_stack->prev) ct->current_stack = ct->current_stack->prev; }