We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.

This lesson's interactive features are locked, please to keep using them

Free

Recall the refcount_free function that you wrote in the previous chapter. It should have looked something like this:

void refcount_free(snek_object_t *obj) {
  switch (obj->kind) {
    case INTEGER:
    case FLOAT:
      break;
    case STRING:
      free(obj->data.v_string);
      break;
    case VECTOR3: {
      snek_vector_t vec = obj->data.v_vector3;
      refcount_dec(vec.x);
      refcount_dec(vec.y);
      refcount_dec(vec.z);
      break;
    }
    case ARRAY: {
      snek_array_t *array = &obj->data.v_array;
      for (size_t i = 0; i < array->size; i++) {
        refcount_dec(array->elements[i]);
      }
      free(array->elements);
      break;
    }
  }
  free(obj);
}

Assignment

Let's rewrite our free-ing logic for mark-and-sweep. Because the virtual machine is the one tracking objects, all of the refcount_dec work can be removed! There's some very cool tricks coming up for mark-and-sweep to manage this, but for now you can just trust me that we'll correctly free any of the contained elements if they are no longer alive.