Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/V8StringResource.h

Issue 1583263002: Experimental CompressibleString UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 10 matching lines...) Expand all
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE. 23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #ifndef V8StringResource_h 26 #ifndef V8StringResource_h
27 #define V8StringResource_h 27 #define V8StringResource_h
28 28
29 #include "bindings/core/v8/ExceptionState.h" 29 #include "bindings/core/v8/ExceptionState.h"
30 #include "core/CoreExport.h" 30 #include "core/CoreExport.h"
31 #include "platform/text/CompressibleString.h"
31 #include "wtf/Allocator.h" 32 #include "wtf/Allocator.h"
32 #include "wtf/Threading.h" 33 #include "wtf/Threading.h"
33 #include "wtf/text/AtomicString.h" 34 #include "wtf/text/AtomicString.h"
34 #include <v8.h> 35 #include <v8.h>
35 36
36 namespace blink { 37 namespace blink {
37 38
38 // WebCoreStringResource is a helper class for v8ExternalString. It is used 39 // WebCoreStringResource is a helper class for v8ExternalString. It is used
39 // to manage the life-cycle of the underlying buffer of the external string. 40 // to manage the life-cycle of the underlying buffer of the external string.
40 class WebCoreStringResourceBase { 41 class WebCoreStringResourceBase {
(...skipping 14 matching lines...) Expand all
55 : m_plainString(string.string()) 56 : m_plainString(string.string())
56 , m_atomicString(string) 57 , m_atomicString(string)
57 { 58 {
58 #if ENABLE(ASSERT) 59 #if ENABLE(ASSERT)
59 m_threadId = WTF::currentThread(); 60 m_threadId = WTF::currentThread();
60 #endif 61 #endif
61 ASSERT(!string.isNull()); 62 ASSERT(!string.isNull());
62 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(memoryC onsumption(string)); 63 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(memoryC onsumption(string));
63 } 64 }
64 65
66 explicit WebCoreStringResourceBase(const CompressibleString& string)
67 : m_compressibleString(string)
68 {
69 #if ENABLE(ASSERT)
70 m_threadId = WTF::currentThread();
71 #endif
72 ASSERT(!string.isNull());
73 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(memoryC onsumption(string));
74 }
75
65 virtual ~WebCoreStringResourceBase() 76 virtual ~WebCoreStringResourceBase()
66 { 77 {
67 #if ENABLE(ASSERT) 78 #if ENABLE(ASSERT)
68 ASSERT(m_threadId == WTF::currentThread()); 79 ASSERT(m_threadId == WTF::currentThread());
69 #endif 80 #endif
70 int reducedExternalMemory = -memoryConsumption(m_plainString); 81 int reducedExternalMemory = 0;
71 if (m_plainString.impl() != m_atomicString.impl() && !m_atomicString.isN ull()) 82 if (LIKELY(m_compressibleString.isNull())) {
72 reducedExternalMemory -= memoryConsumption(m_atomicString.string()); 83 reducedExternalMemory = -memoryConsumption(m_plainString);
84 if (m_plainString.impl() != m_atomicString.impl() && !m_atomicString .isNull())
85 reducedExternalMemory -= memoryConsumption(m_atomicString.string ());
86 } else {
87 reducedExternalMemory = -memoryConsumption(m_compressibleString);
88 }
73 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(reduced ExternalMemory); 89 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(reduced ExternalMemory);
90
91 // FIX this!
haraken 2016/01/15 12:46:21 What do you mean?
hajimehoshi 2016/01/18 09:42:26 Ah, sorry... I mean we need to decide if memoryCon
74 } 92 }
75 93
76 const String& webcoreString() { return m_plainString; } 94 String webcoreString()
95 {
96 if (!m_compressibleString.isNull()) {
haraken 2016/01/15 12:46:20 Add UNLIKELY.
hajimehoshi 2016/01/18 09:42:26 Done.
97 ASSERT(m_plainString.isNull());
98 ASSERT(m_atomicString.isNull());
99 return m_compressibleString.toString();
100 }
101 return m_plainString;
102 }
77 103
78 const AtomicString& atomicString() 104 AtomicString atomicString()
79 { 105 {
80 #if ENABLE(ASSERT) 106 #if ENABLE(ASSERT)
81 ASSERT(m_threadId == WTF::currentThread()); 107 ASSERT(m_threadId == WTF::currentThread());
82 #endif 108 #endif
109 if (!m_compressibleString.isNull()) {
haraken 2016/01/15 12:46:20 Add UNLIKELY.
hajimehoshi 2016/01/18 09:42:26 Done.
110 ASSERT(m_plainString.isNull());
111 ASSERT(m_atomicString.isNull());
112 return AtomicString(m_compressibleString.toString());
113 }
83 if (m_atomicString.isNull()) { 114 if (m_atomicString.isNull()) {
84 m_atomicString = AtomicString(m_plainString); 115 m_atomicString = AtomicString(m_plainString);
85 ASSERT(!m_atomicString.isNull()); 116 ASSERT(!m_atomicString.isNull());
86 if (m_plainString.impl() != m_atomicString.impl()) 117 if (m_plainString.impl() != m_atomicString.impl())
87 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory (memoryConsumption(m_atomicString.string())); 118 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory (memoryConsumption(m_atomicString.string()));
88 } 119 }
89 return m_atomicString; 120 return m_atomicString;
90 } 121 }
91 122
123 const CompressibleString& compressibleString() { return m_compressibleString ; }
124
92 protected: 125 protected:
93 // A shallow copy of the string. Keeps the string buffer alive until the V8 engine garbage collects it. 126 // A shallow copy of the string. Keeps the string buffer alive until the V8 engine garbage collects it.
94 String m_plainString; 127 String m_plainString;
95 // If this string is atomic or has been made atomic earlier the 128 // If this string is atomic or has been made atomic earlier the
96 // atomic string is held here. In the case where the string starts 129 // atomic string is held here. In the case where the string starts
97 // off non-atomic and becomes atomic later it is necessary to keep 130 // off non-atomic and becomes atomic later it is necessary to keep
98 // the original string alive because v8 may keep derived pointers 131 // the original string alive because v8 may keep derived pointers
99 // into that string. 132 // into that string.
100 AtomicString m_atomicString; 133 AtomicString m_atomicString;
101 134
135 CompressibleString m_compressibleString;
136
102 private: 137 private:
103 static int memoryConsumption(const String& string) 138 static int memoryConsumption(const String& string)
104 { 139 {
105 return string.length() * (string.is8Bit() ? sizeof(LChar) : sizeof(UChar )); 140 return string.length() * (string.is8Bit() ? sizeof(LChar) : sizeof(UChar ));
106 } 141 }
142
143 static int memoryConsumption(const CompressibleString& string)
144 {
145 return string.currentSizeInBytes();
146 }
147
107 #if ENABLE(ASSERT) 148 #if ENABLE(ASSERT)
108 WTF::ThreadIdentifier m_threadId; 149 WTF::ThreadIdentifier m_threadId;
109 #endif 150 #endif
110 }; 151 };
111 152
112 class WebCoreStringResource16 final : public WebCoreStringResourceBase, public v 8::String::ExternalStringResource { 153 class WebCoreStringResource16 final : public WebCoreStringResourceBase, public v 8::String::ExternalStringResource {
113 WTF_MAKE_NONCOPYABLE(WebCoreStringResource16); 154 WTF_MAKE_NONCOPYABLE(WebCoreStringResource16);
114 public: 155 public:
115 explicit WebCoreStringResource16(const String& string) 156 explicit WebCoreStringResource16(const String& string)
116 : WebCoreStringResourceBase(string) 157 : WebCoreStringResourceBase(string)
(...skipping 29 matching lines...) Expand all
146 ASSERT(string.is8Bit()); 187 ASSERT(string.is8Bit());
147 } 188 }
148 189
149 size_t length() const override { return m_plainString.impl()->length(); } 190 size_t length() const override { return m_plainString.impl()->length(); }
150 const char* data() const override 191 const char* data() const override
151 { 192 {
152 return reinterpret_cast<const char*>(m_plainString.impl()->characters8() ); 193 return reinterpret_cast<const char*>(m_plainString.impl()->characters8() );
153 } 194 }
154 }; 195 };
155 196
197 class WebCoreCompressibleStringResource16 final : public WebCoreStringResourceBa se, public v8::String::ExternalStringResource {
198 WTF_MAKE_NONCOPYABLE(WebCoreCompressibleStringResource16);
199 public:
200 explicit WebCoreCompressibleStringResource16(const CompressibleString& strin g)
201 : WebCoreStringResourceBase(string)
202 {
203 // ASSERT(m_string);
haraken 2016/01/15 12:46:21 Remove this.
hajimehoshi 2016/01/18 09:42:26 Done.
204 ASSERT(!m_compressibleString.is8Bit());
205 }
206
207 bool IsCompressible() const override { return true; }
208
209 size_t length() const override
210 {
211 return m_compressibleString.length();
212 }
213
214 const uint16_t* data() const override
215 {
216 return reinterpret_cast<const uint16_t*>(m_compressibleString.characters 16());
217 }
218 };
219
220 class WebCoreCompressibleStringResource8 final : public WebCoreStringResourceBas e, public v8::String::ExternalOneByteStringResource {
221 WTF_MAKE_NONCOPYABLE(WebCoreCompressibleStringResource8);
222 public:
223 explicit WebCoreCompressibleStringResource8(const CompressibleString& string )
224 : WebCoreStringResourceBase(string)
225 {
226 ASSERT(m_compressibleString.is8Bit());
227 }
228
229 bool IsCompressible() const override { return true; }
230
231 size_t length() const override
232 {
233 return m_compressibleString.length();
234 }
235
236 const char* data() const override
237 {
238 return reinterpret_cast<const char*>(m_compressibleString.characters8()) ;
239 }
240 };
241
156 enum ExternalMode { 242 enum ExternalMode {
157 Externalize, 243 Externalize,
158 DoNotExternalize 244 DoNotExternalize
159 }; 245 };
160 246
161 template <typename StringType> 247 template <typename StringType>
162 CORE_EXPORT StringType v8StringToWebCoreString(v8::Local<v8::String>, ExternalMo de); 248 CORE_EXPORT StringType v8StringToWebCoreString(v8::Local<v8::String>, ExternalMo de);
163 CORE_EXPORT String int32ToWebCoreString(int value); 249 CORE_EXPORT String int32ToWebCoreString(int value);
164 250
165 // V8StringResource is an adapter class that converts V8 values to Strings 251 // V8StringResource is an adapter class that converts V8 values to Strings
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 } 406 }
321 407
322 template<> inline String V8StringResource<TreatNullAndUndefinedAsNullString>::fa llbackString() const 408 template<> inline String V8StringResource<TreatNullAndUndefinedAsNullString>::fa llbackString() const
323 { 409 {
324 return String(); 410 return String();
325 } 411 }
326 412
327 } // namespace blink 413 } // namespace blink
328 414
329 #endif // V8StringResource_h 415 #endif // V8StringResource_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698