// 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 "vm/kernel.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),
      kernel_program(NULL),
      builtin_lib_(NULL),
      loader_(NULL),
      app_snapshot_(app_snapshot),
      dependencies_(NULL),
      create_isolate_from_kernel_(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() {
  if (builtin_lib_ != NULL) {
    Dart_DeletePersistentHandle(builtin_lib_);
    builtin_lib_ = NULL;
  }
}

IsolateData::~IsolateData() {
  free(script_url);
  script_url = NULL;
  free(package_root);
  package_root = NULL;
  free(packages_file);
  packages_file = NULL;
  if (kernel_program != NULL) {
    delete reinterpret_cast<kernel::Program*>(kernel_program);
    kernel_program = NULL;
  }
  delete app_snapshot_;
  app_snapshot_ = NULL;
}

}  // namespace bin
}  // namespace dart
