X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;ds=sidebyside;f=templates%2Fprogram.c;h=25f9acbf4820f7b3b392c458751460668033dff5;hb=76ffe5adf4f6497945684e700dec15c809897d77;hp=6b4988176b6ccfa8d0bac91bc15b4b49267da24f;hpb=3eef27fe9f504e67ec74e330587007eb7b28946f;p=fur diff --git a/templates/program.c b/templates/program.c index 6b49881..25f9acb 100644 --- a/templates/program.c +++ b/templates/program.c @@ -163,6 +163,18 @@ void Stack_initialize(Stack* self) self->length = 0; } +Stack* Stack_construct() +{ + Stack* result = malloc(sizeof(Stack)); + Stack_initialize(result); + return result; +} + +void Stack_destruct(Stack* self) +{ + free(self); +} + bool Stack_any(Stack* self) { return self->length > 0; @@ -321,6 +333,22 @@ void Object_deinitialize(Object* self) } } +typedef uint32_t StackSnapshot; + +StackSnapshot Stack_takeSnapshot(Stack* self) +{ + return (StackSnapshot) self->length; +} + +void Stack_rewind(Stack* self, StackSnapshot snapshot) +{ + while(self->length > snapshot) + { + Object item = Stack_pop(self); + Object_deinitialize(&item); + } +} + void Environment_deinitialize(Environment* self) { EnvironmentNode* next; @@ -522,6 +550,13 @@ Environment* EnvironmentPool_allocate(EnvironmentPool* self) return EnvironmentPool_allocate(previous->overflow); } +Environment* Environment_construct(EnvironmentPool* environmentPool, Environment* parent) +{ + Environment* environment = EnvironmentPool_allocate(environmentPool); + Environment_initialize(environment, parent); + return environment; +} + Object integerLiteral(int32_t literal) { Object result;