/**
 * call-seq:
 *     finalize( vm ) -> nil
 *
 * Destroys the given virtual machine and releases any associated memory. Once
 * finalized, the VM should not be used.
 */
static VALUE
static_api_finalize( VALUE module, VALUE vm )
{
  sqlite_vm *vm_ptr;
  int        result;
  char      *errmsg;

  /* FIXME: should this be executed atomically? */
  GetVM( vm_ptr, vm );

  result = sqlite_finalize( vm_ptr, &errmsg );
  if( result != SQLITE_OK )
  {
    static_raise_db_error2( result, &errmsg );
    /* "raise" does not return */
  }

  /* don't need to free the handle anymore */
  RDATA(vm)->dfree = NULL;
  RDATA(vm)->data = NULL;

  return Qnil;
}