Mercurial > hg > Papers > 2023 > soto-master
diff Paper/src/context2.c @ 1:a72446879486
Init paper
author | soto <soto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Jan 2023 20:28:50 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/context2.c Thu Jan 12 20:28:50 2023 +0900 @@ -0,0 +1,37 @@ +#include <stdlib.h> + +#include "../context.h" + +void initContext(struct Context* context) { + context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE; + context->code = (__code(**) (struct Context*)) NEWN(ALLOCATE_SIZE, void*); + context->data = NEWN(ALLOCATE_SIZE, union Data*); + context->heapStart = NEWN(context->heapLimit, char); + context->heap = context->heapStart; + + context->code[C_cs1] = cs1_stub; + context->code[C_cs2] = cs2_stub; + context->code[C_exit_code] = exit_code_stub; + context->code[C_start_code] = start_code_stub; + +#include "dataGearInit.c" +} +__code meta(struct Context* context, enum Code next) { + // printf("meta %d\n",next); + goto (context->code[next])(context); +} +__code start_code(struct Context* context) { + goto meta(context, context->next); +} +__code start_code_stub(struct Context* context) { + goto start_code(context); +} +__code exit_code(struct Context* context) { + free(context->code); + free(context->data); + free(context->heapStart); + goto exit(0); +} +__code exit_code_stub(struct Context* context) { + goto exit_code(context); +}