diff --git a/lang/vm.c b/lang/vm.c index cf1ba6d..cd55c22 100644 --- a/lang/vm.c +++ b/lang/vm.c @@ -12,10 +12,9 @@ #include struct vm_state { - Object *stack; + struct object_list *stack; int stack_base; int stack_next; - int stack_size; Object tail_obj; const char *tail_name; StackTrace stack_trace; @@ -25,21 +24,18 @@ struct vm_state *state = calloc(sizeof(struct vm_state), 1); if (state == NULL) abort_print("vm_create: unable to allocate state"); - state->stack_size = 16; state->stack_base = 0; state->stack_next = 0; state->tail_obj = object_none(); state->tail_name = NULL; - state->stack = malloc(sizeof(Object) * state->stack_size); - if (state->stack == NULL) - abort_print("vm_create: unable to allocate stack"); + state->stack = object_list_create(16); state->stack_trace = stacktrace_create(32); return (VmState)state; } void vm_destroy(VmState *state) { struct vm_state **priv = (struct vm_state **)state; - free((*priv)->stack); + object_list_free(&(*priv)->stack); free((*priv)->stack_trace); free(*priv); } @@ -50,7 +46,7 @@ vm_abort_if(state, index < 0, "vm_stack_set: negative value"); vm_abort_if(state, offset >= priv->stack_next, "vm_stack_set: stack overflow"); - Object *stack_pos = &priv->stack[offset]; + Object *stack_pos = &priv->stack->elems[offset]; object_drop(state, stack_pos); *stack_pos = obj; } @@ -61,7 +57,7 @@ vm_abort_if(state, index < 0, "vm_stack_get: negative value"); vm_abort_if(state, offset >= priv->stack_next, "vm_stack_get: stack overflow"); - Object obj = priv->stack[offset]; + Object obj = priv->stack->elems[offset]; object_hold(state, obj); return obj; } @@ -70,20 +66,20 @@ struct vm_state *priv = (struct vm_state *)state; // stack_next starts at 0, stack_size starts at 1 // Convert stack_size to a max stack offset to compensate - int max_stack = priv->stack_size - 1; + int max_stack = priv->stack->length - 1; // Check if stack_next is outside the stack before // writing to it vm_abort_if(state, priv->stack_next > max_stack, "vm_stack_push: stack overflow"); - priv->stack[priv->stack_next++] = obj; + priv->stack->elems[priv->stack_next++] = obj; } Object vm_stack_pop(VmState state) { struct vm_state *priv = (struct vm_state *)state; vm_abort_if(state, priv->stack_next <= priv->stack_base, "vm_stack_pop: stack base underflow"); - Object obj = priv->stack[--priv->stack_next]; - priv->stack[priv->stack_next] = object_none(); + Object obj = priv->stack->elems[--priv->stack_next]; + priv->stack->elems[priv->stack_next] = object_none(); return obj; }