Index: tonic/dart_string_cache.cc |
diff --git a/tonic/dart_string_cache.cc b/tonic/dart_string_cache.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3cb267b4e3683a14533ed82d597f58daa3150f45 |
--- /dev/null |
+++ b/tonic/dart_string_cache.cc |
@@ -0,0 +1,66 @@ |
+// Copyright 2014 The Chromium 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_string_cache.h" |
+ |
+#include "tonic/dart_state.h" |
+#include "tonic/dart_string.h" |
+ |
+namespace blink { |
+ |
+DartStringCache::DartStringCache() : last_dart_string_(nullptr) { |
+} |
+ |
+DartStringCache::~DartStringCache() { |
+} |
+ |
+Dart_WeakPersistentHandle DartStringCache::GetSlow(StringImpl* string_impl, |
+ bool auto_scope) { |
+ if (Dart_WeakPersistentHandle string = cache_.get(string_impl)) { |
+ last_dart_string_ = string; |
+ last_string_impl_ = string_impl; |
+ return string; |
+ } |
+ |
+ if (!auto_scope) |
+ Dart_EnterScope(); |
+ |
+ Dart_Handle string = CreateDartString(string_impl); |
+ DCHECK(!Dart_IsError(string)); |
+ |
+ intptr_t size_in_bytes = string_impl->sizeInBytes(); |
+ Dart_WeakPersistentHandle wrapper = Dart_NewWeakPersistentHandle( |
+ string, string_impl, size_in_bytes, FinalizeCacheEntry); |
+ |
+ string_impl->ref(); // Balanced in FinalizeCacheEntry. |
+ cache_.set(string_impl, wrapper); |
+ |
+ last_dart_string_ = wrapper; |
+ last_string_impl_ = string_impl; |
+ |
+ if (!auto_scope) |
+ Dart_ExitScope(); |
+ |
+ return wrapper; |
+} |
+ |
+void DartStringCache::FinalizeCacheEntry(void* isolate_callback_data, |
+ Dart_WeakPersistentHandle handle, |
+ void* peer) { |
+ DartState* state = reinterpret_cast<DartState*>(isolate_callback_data); |
+ StringImpl* string_impl = reinterpret_cast<StringImpl*>(peer); |
+ DartStringCache& cache = state->string_cache(); |
+ |
+ Dart_WeakPersistentHandle cached_handle = cache.cache_.take(string_impl); |
+ ASSERT_UNUSED(cached_handle, handle == cached_handle); |
+ |
+ if (cache.last_dart_string_ == handle) { |
+ cache.last_dart_string_ = nullptr; |
+ cache.last_string_impl_ = nullptr; |
+ } |
+ |
+ string_impl->deref(); |
+} |
+ |
+} // namespace blink |