Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/StringResource.h |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/StringResource.h b/third_party/WebKit/Source/bindings/core/v8/StringResource.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..66276bbc5608274791b42a8d96e1b7490d751510 |
| --- /dev/null |
| +++ b/third_party/WebKit/Source/bindings/core/v8/StringResource.h |
| @@ -0,0 +1,138 @@ |
| +// Copyright 2017 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. |
| + |
| +#ifndef StringResource_h |
| +#define StringResource_h |
| + |
| +#include "core/CoreExport.h" |
| +#include "platform/wtf/Allocator.h" |
| +#include "platform/wtf/Threading.h" |
| +#include "platform/wtf/text/AtomicString.h" |
| +#include "v8/include/v8.h" |
| + |
| +namespace blink { |
| + |
| +// StringResource is a helper class for v8ExternalString. It is used |
|
jbroman
2017/04/18 15:37:44
nit: V8ExternalString (post rename)
adithyas
2017/04/18 15:52:23
Fixed.
|
| +// to manage the life-cycle of the underlying buffer of the external string. |
| +class StringResourceBase { |
| + USING_FAST_MALLOC(StringResourceBase); |
| + WTF_MAKE_NONCOPYABLE(StringResourceBase); |
| + |
| + public: |
| + explicit StringResourceBase(const String& string) : plain_string_(string) { |
| +#if DCHECK_IS_ON() |
| + thread_id_ = WTF::CurrentThread(); |
| +#endif |
| + DCHECK(!string.IsNull()); |
| + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
| + string.CharactersSizeInBytes()); |
| + } |
| + |
| + explicit StringResourceBase(const AtomicString& string) |
| + : plain_string_(string.GetString()), atomic_string_(string) { |
| +#if DCHECK_IS_ON() |
| + thread_id_ = WTF::CurrentThread(); |
| +#endif |
| + DCHECK(!string.IsNull()); |
| + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
| + string.CharactersSizeInBytes()); |
| + } |
| + |
| + virtual ~StringResourceBase() { |
| +#if DCHECK_IS_ON() |
| + DCHECK(thread_id_ == WTF::CurrentThread()); |
| +#endif |
| + int64_t reduced_external_memory = plain_string_.CharactersSizeInBytes(); |
| + if (plain_string_.Impl() != atomic_string_.Impl() && |
| + !atomic_string_.IsNull()) |
| + reduced_external_memory += atomic_string_.CharactersSizeInBytes(); |
| + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
| + -reduced_external_memory); |
| + } |
| + |
| + const String& WebcoreString() { return plain_string_; } |
| + |
| + const AtomicString& GetAtomicString() { |
| +#if DCHECK_IS_ON() |
| + DCHECK(thread_id_ == WTF::CurrentThread()); |
| +#endif |
| + if (atomic_string_.IsNull()) { |
| + atomic_string_ = AtomicString(plain_string_); |
| + DCHECK(!atomic_string_.IsNull()); |
| + if (plain_string_.Impl() != atomic_string_.Impl()) { |
| + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
| + atomic_string_.CharactersSizeInBytes()); |
| + } |
| + } |
| + return atomic_string_; |
| + } |
| + |
| + protected: |
| + // A shallow copy of the string. Keeps the string buffer alive until the V8 |
| + // engine garbage collects it. |
| + String plain_string_; |
| + // If this string is atomic or has been made atomic earlier the |
| + // atomic string is held here. In the case where the string starts |
| + // off non-atomic and becomes atomic later it is necessary to keep |
| + // the original string alive because v8 may keep derived pointers |
| + // into that string. |
| + AtomicString atomic_string_; |
| + |
| + private: |
| +#if DCHECK_IS_ON() |
| + WTF::ThreadIdentifier thread_id_; |
| +#endif |
| +}; |
| + |
| +class StringResource16 final : public StringResourceBase, |
| + public v8::String::ExternalStringResource { |
| + WTF_MAKE_NONCOPYABLE(StringResource16); |
| + |
| + public: |
| + explicit StringResource16(const String& string) : StringResourceBase(string) { |
| + DCHECK(!string.Is8Bit()); |
| + } |
| + |
| + explicit StringResource16(const AtomicString& string) |
| + : StringResourceBase(string) { |
| + DCHECK(!string.Is8Bit()); |
| + } |
| + |
| + size_t length() const override { return plain_string_.Impl()->length(); } |
| + const uint16_t* data() const override { |
| + return reinterpret_cast<const uint16_t*>( |
| + plain_string_.Impl()->Characters16()); |
| + } |
| +}; |
| + |
| +class StringResource8 final : public StringResourceBase, |
| + public v8::String::ExternalOneByteStringResource { |
| + WTF_MAKE_NONCOPYABLE(StringResource8); |
| + |
| + public: |
| + explicit StringResource8(const String& string) : StringResourceBase(string) { |
| + DCHECK(string.Is8Bit()); |
| + } |
| + |
| + explicit StringResource8(const AtomicString& string) |
| + : StringResourceBase(string) { |
| + DCHECK(string.Is8Bit()); |
| + } |
| + |
| + size_t length() const override { return plain_string_.Impl()->length(); } |
| + const char* data() const override { |
| + return reinterpret_cast<const char*>(plain_string_.Impl()->Characters8()); |
| + } |
| +}; |
| + |
| +enum ExternalMode { kExternalize, kDoNotExternalize }; |
| + |
| +template <typename StringType> |
| +CORE_EXPORT StringType V8StringToWebCoreString(v8::Local<v8::String>, |
|
jbroman
2017/04/18 15:37:44
Since you renamed the other references to WebCore
adithyas
2017/04/18 15:52:23
Ok, I'll file a bug.
|
| + ExternalMode); |
| +CORE_EXPORT String Int32ToWebCoreString(int value); |
| + |
| +} // namespace blink |
| + |
| +#endif // StringResource_h |