#include "virt_stack.h" #include virt_stack *vstack_create () { return malloc(sizeof(virt_stack)); } void vstack_destruct (virt_stack *st) { free(st); } void vstack_init (virt_stack *st) { st->cur = RUNTIME_VSTACK_SIZE; st->buf[st->cur] = 0; } void vstack_push (virt_stack *st, size_t value) { if (st->cur == 0) { assert(0); } --st->cur; st->buf[st->cur] = value; } size_t vstack_pop (virt_stack *st) { if (st->cur == RUNTIME_VSTACK_SIZE) { assert(0); } size_t value = st->buf[st->cur]; ++st->cur; return value; } void *vstack_top (virt_stack *st) { return st->buf + st->cur; } size_t vstack_size (virt_stack *st) { return RUNTIME_VSTACK_SIZE - st->cur; } size_t vstack_kth_from_start (virt_stack *st, size_t k) { assert(vstack_size(st) > k); return st->buf[RUNTIME_VSTACK_SIZE - 1 - k]; }