mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
The tonic layer is analogous to "gin" for v8. It provides wrappers and helpers around common dart types and implements the basic infrastructure for allowing dart wrappers around sky DOM objects to have proper GC behavior. R=abarth@chromium.org TBR=eseidel BUG= Review URL: https://codereview.chromium.org/924593002
66 lines
1.9 KiB
C++
66 lines
1.9 KiB
C++
// 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 "sky/engine/config.h"
|
|
#include "sky/engine/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
|