John McCutchan | 080c33e | 2015-07-16 12:35:35 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "tonic/dart_persistent_value.h" |
| 6 | |
| 7 | #include "tonic/dart_isolate_scope.h" |
| 8 | #include "tonic/dart_state.h" |
| 9 | |
John McCutchan | deace8f | 2015-07-21 08:01:40 -0700 | [diff] [blame] | 10 | namespace tonic { |
John McCutchan | 080c33e | 2015-07-16 12:35:35 -0700 | [diff] [blame] | 11 | |
| 12 | DartPersistentValue::DartPersistentValue() : value_(nullptr) { |
| 13 | } |
| 14 | |
| 15 | DartPersistentValue::DartPersistentValue(DartState* dart_state, |
| 16 | Dart_Handle value) |
| 17 | : value_(nullptr) { |
| 18 | Set(dart_state, value); |
| 19 | } |
| 20 | |
| 21 | DartPersistentValue::~DartPersistentValue() { |
| 22 | Clear(); |
| 23 | } |
| 24 | |
| 25 | void DartPersistentValue::Set(DartState* dart_state, Dart_Handle value) { |
| 26 | DCHECK(is_empty()); |
| 27 | dart_state_ = dart_state->GetWeakPtr(); |
| 28 | value_ = Dart_NewPersistentHandle(value); |
| 29 | } |
| 30 | |
| 31 | void DartPersistentValue::Clear() { |
| 32 | if (!value_ || !dart_state_.get()) |
| 33 | return; |
| 34 | |
| 35 | DartIsolateScope scope(dart_state_->isolate()); |
| 36 | Dart_DeletePersistentHandle(value_); |
| 37 | dart_state_ = base::WeakPtr<DartState>(); |
| 38 | value_ = nullptr; |
| 39 | } |
| 40 | |
| 41 | Dart_Handle DartPersistentValue::Release() { |
| 42 | if (!value_) |
| 43 | return nullptr; |
| 44 | Dart_Handle local = Dart_HandleFromPersistent(value_); |
| 45 | Clear(); |
| 46 | return local; |
| 47 | } |
| 48 | } |