// Copyright 2015 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tonic/dart_persistent_value.h"

#include "tonic/dart_state.h"
#include "tonic/scopes/dart_isolate_scope.h"

namespace tonic {

DartPersistentValue::DartPersistentValue() : value_(nullptr) {}

DartPersistentValue::DartPersistentValue(DartPersistentValue&& other)
    : dart_state_(other.dart_state_), value_(other.value_) {
  other.dart_state_.reset();
  other.value_ = nullptr;
}

DartPersistentValue::DartPersistentValue(DartState* dart_state,
                                         Dart_Handle value)
    : value_(nullptr) {
  Set(dart_state, value);
}

DartPersistentValue::~DartPersistentValue() {
  Clear();
}

void DartPersistentValue::Set(DartState* dart_state, Dart_Handle value) {
  TONIC_DCHECK(is_empty());
  dart_state_ = dart_state->GetWeakPtr();
  value_ = Dart_NewPersistentHandle(value);
}

void DartPersistentValue::Clear() {
  if (!value_) {
    return;
  }

  auto dart_state = dart_state_.lock();
  if (!dart_state) {
    return;
  }

  DartIsolateScope scope(dart_state->isolate());
  Dart_DeletePersistentHandle(value_);
  dart_state_.reset();
  value_ = nullptr;
}

Dart_Handle DartPersistentValue::Get() {
  if (!value_)
    return nullptr;
  return Dart_HandleFromPersistent(value_);
}

Dart_Handle DartPersistentValue::Release() {
  Dart_Handle local = Get();
  Clear();
  return local;
}
}  // namespace tonic
