Index: tonic/dart_string.cc |
diff --git a/tonic/dart_string.cc b/tonic/dart_string.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4ec506673e900aeb7f3df744a679d1d7cf0f0d93 |
--- /dev/null |
+++ b/tonic/dart_string.cc |
@@ -0,0 +1,64 @@ |
+// Copyright 2015 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.h" |
+ |
+#include "base/logging.h" |
+ |
+namespace blink { |
+namespace { |
+ |
+void FinalizeString(void* string_impl) { |
+ DCHECK(string_impl); |
+ reinterpret_cast<StringImpl*>(string_impl)->deref(); |
+} |
+ |
+template <typename CharType> |
+String Externalize(Dart_Handle handle, intptr_t length) { |
+ if (!length) |
+ return StringImpl::empty(); |
+ CharType* buffer = nullptr; |
+ RefPtr<StringImpl> string_impl = |
+ StringImpl::createUninitialized(length, buffer); |
+ |
+ string_impl->ref(); // Balanced in FinalizeString. |
+ |
+ Dart_Handle result = |
+ Dart_MakeExternalString(handle, buffer, length * sizeof(CharType), |
+ string_impl.get(), FinalizeString); |
+ DCHECK(!Dart_IsError(result)); |
+ return String(string_impl.release()); |
+} |
+ |
+} // namespace |
+ |
+Dart_Handle CreateDartString(StringImpl* string_impl) { |
+ if (!string_impl) |
+ return Dart_EmptyString(); |
+ |
+ string_impl->ref(); // Balanced in FinalizeString. |
+ |
+ if (string_impl->is8Bit()) { |
+ return Dart_NewExternalLatin1String(string_impl->characters8(), |
+ string_impl->length(), string_impl, |
+ FinalizeString); |
+ } else { |
+ return Dart_NewExternalUTF16String(string_impl->characters16(), |
+ string_impl->length(), string_impl, |
+ FinalizeString); |
+ } |
+} |
+ |
+String ExternalizeDartString(Dart_Handle handle) { |
+ DCHECK(Dart_IsString(handle)); |
+ DCHECK(!Dart_IsExternalString(handle)); |
+ bool is_latin1 = Dart_IsStringLatin1(handle); |
+ intptr_t length; |
+ Dart_StringLength(handle, &length); |
+ if (is_latin1) |
+ return Externalize<LChar>(handle, length); |
+ return Externalize<UChar>(handle, length); |
+} |
+ |
+} // namespace blink |