// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "bin/isolate_data.h"
#include "bin/snapshot_utils.h"
#include "platform/growable_array.h"

namespace dart {
namespace bin {

IsolateData::IsolateData(const char* url,
                         const char* package_root,
                         const char* packages_file,
                         AppSnapshot* app_snapshot)
    : script_url((url != NULL) ? strdup(url) : NULL),
      package_root(NULL),
      packages_file(NULL),
      loader_(NULL),
      app_snapshot_(app_snapshot),
      dependencies_(NULL),
      resolved_packages_config_(NULL),
      kernel_buffer_(NULL),
      kernel_buffer_size_(0),
      owns_kernel_buffer_(false) {
  if (package_root != NULL) {
    ASSERT(packages_file == NULL);
    this->package_root = strdup(package_root);
  } else if (packages_file != NULL) {
    this->packages_file = strdup(packages_file);
  }
}

void IsolateData::OnIsolateShutdown() {
}

IsolateData::~IsolateData() {
  free(script_url);
  script_url = NULL;
  free(package_root);
  package_root = NULL;
  free(packages_file);
  packages_file = NULL;
  free(resolved_packages_config_);
  resolved_packages_config_ = NULL;
  if (owns_kernel_buffer_) {
    ASSERT(kernel_buffer_ != NULL);
    free(kernel_buffer_);
  }
  kernel_buffer_ = NULL;
  kernel_buffer_size_ = 0;
  delete app_snapshot_;
  app_snapshot_ = NULL;
  delete dependencies_;
}

}  // namespace bin
}  // namespace dart
