| OLD | NEW | 
|---|
| 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 13 matching lines...) Expand all  Loading... | 
| 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 "wtf/Allocator.h" | 31 #include "wtf/Allocator.h" | 
| 32 #include "wtf/Threading.h" | 32 #include "wtf/Threading.h" | 
| 33 #include "wtf/text/AtomicString.h" | 33 #include "wtf/text/AtomicString.h" | 
|  | 34 #include "wtf/text/CompressibleString.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 { | 
| 41     USING_FAST_MALLOC(WebCoreStringResourceBase); | 42     USING_FAST_MALLOC(WebCoreStringResourceBase); | 
| 42     WTF_MAKE_NONCOPYABLE(WebCoreStringResourceBase); | 43     WTF_MAKE_NONCOPYABLE(WebCoreStringResourceBase); | 
| 43 public: | 44 public: | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 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! | 
| 74     } | 92     } | 
| 75 | 93 | 
| 76     const String& webcoreString() { return m_plainString; } | 94     String webcoreString() | 
|  | 95     { | 
|  | 96         if (!m_compressibleString.isNull()) { | 
|  | 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()) { | 
|  | 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  Loading... | 
| 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); | 
|  | 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|