diff options
author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
tree | e367e64a75991c554930278175d403c072de6bb8 /Source/JavaScriptCore/parser/SourceProviderCacheItem.h | |
parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
download | qtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz |
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit.
Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/JavaScriptCore/parser/SourceProviderCacheItem.h')
-rw-r--r-- | Source/JavaScriptCore/parser/SourceProviderCacheItem.h | 100 |
1 files changed, 79 insertions, 21 deletions
diff --git a/Source/JavaScriptCore/parser/SourceProviderCacheItem.h b/Source/JavaScriptCore/parser/SourceProviderCacheItem.h index ec3890560..8d35a3d27 100644 --- a/Source/JavaScriptCore/parser/SourceProviderCacheItem.h +++ b/Source/JavaScriptCore/parser/SourceProviderCacheItem.h @@ -27,37 +27,46 @@ #define SourceProviderCacheItem_h #include "ParserTokens.h" +#include <wtf/PassOwnPtr.h> #include <wtf/Vector.h> #include <wtf/text/WTFString.h> namespace JSC { +struct SourceProviderCacheItemCreationParameters { + unsigned functionStart; + unsigned closeBraceLine; + unsigned closeBraceOffset; + unsigned closeBraceLineStartOffset; + bool needsFullActivation; + bool usesEval; + bool strictMode; + Vector<RefPtr<StringImpl> > usedVariables; + Vector<RefPtr<StringImpl> > writtenVariables; +}; + +#if COMPILER(MSVC) +#pragma warning(push) +#pragma warning(disable: 4200) // Disable "zero-sized array in struct/union" warning +#endif + class SourceProviderCacheItem { WTF_MAKE_FAST_ALLOCATED; public: - SourceProviderCacheItem(unsigned functionStart, unsigned closeBraceLine, unsigned closeBracePos) - : functionStart(functionStart) - , closeBraceLine(closeBraceLine) - , closeBracePos(closeBracePos) - { - } - unsigned approximateByteSize() const - { - // The identifiers are uniqued strings so most likely there are few names that actually use any additional memory. - static const unsigned assummedAverageIdentifierSize = sizeof(RefPtr<StringImpl>) + 2; - unsigned size = sizeof(*this); - size += usedVariables.size() * assummedAverageIdentifierSize; - size += writtenVariables.size() * assummedAverageIdentifierSize; - return size; - } + static PassOwnPtr<SourceProviderCacheItem> create(const SourceProviderCacheItemCreationParameters&); + ~SourceProviderCacheItem(); + JSToken closeBraceToken() const { JSToken token; token.m_type = CLOSEBRACE; - token.m_data.intValue = closeBracePos; - token.m_location.startOffset = closeBracePos; - token.m_location.endOffset = closeBracePos + 1; + token.m_data.offset = closeBraceOffset; + token.m_location.startOffset = closeBraceOffset; + token.m_location.endOffset = closeBraceOffset + 1; token.m_location.line = closeBraceLine; + token.m_location.lineStartOffset = closeBraceLineStartOffset; + // token.m_location.sourceOffset is initialized once by the client. So, + // we do not need to set it here. return token; } @@ -67,13 +76,62 @@ public: unsigned closeBraceLine : 31; bool usesEval : 1; - unsigned closeBracePos : 31; + unsigned closeBraceOffset : 31; bool strictMode : 1; - Vector<RefPtr<StringImpl> > usedVariables; - Vector<RefPtr<StringImpl> > writtenVariables; + unsigned closeBraceLineStartOffset; + unsigned usedVariablesCount; + unsigned writtenVariablesCount; + + StringImpl** usedVariables() const { return const_cast<StringImpl**>(m_variables); } + StringImpl** writtenVariables() const { return const_cast<StringImpl**>(&m_variables[usedVariablesCount]); } + +private: + SourceProviderCacheItem(const SourceProviderCacheItemCreationParameters&); + + StringImpl* m_variables[0]; }; +inline SourceProviderCacheItem::~SourceProviderCacheItem() +{ + for (unsigned i = 0; i < usedVariablesCount + writtenVariablesCount; ++i) + m_variables[i]->deref(); +} + +inline PassOwnPtr<SourceProviderCacheItem> SourceProviderCacheItem::create(const SourceProviderCacheItemCreationParameters& parameters) +{ + size_t variableCount = parameters.writtenVariables.size() + parameters.usedVariables.size(); + size_t objectSize = sizeof(SourceProviderCacheItem) + sizeof(StringImpl*) * variableCount; + void* slot = fastMalloc(objectSize); + return adoptPtr(new (slot) SourceProviderCacheItem(parameters)); +} + +inline SourceProviderCacheItem::SourceProviderCacheItem(const SourceProviderCacheItemCreationParameters& parameters) + : functionStart(parameters.functionStart) + , needsFullActivation(parameters.needsFullActivation) + , closeBraceLine(parameters.closeBraceLine) + , usesEval(parameters.usesEval) + , closeBraceOffset(parameters.closeBraceOffset) + , strictMode(parameters.strictMode) + , closeBraceLineStartOffset(parameters.closeBraceLineStartOffset) + , usedVariablesCount(parameters.usedVariables.size()) + , writtenVariablesCount(parameters.writtenVariables.size()) +{ + unsigned j = 0; + for (unsigned i = 0; i < usedVariablesCount; ++i, ++j) { + m_variables[j] = parameters.usedVariables[i].get(); + m_variables[j]->ref(); + } + for (unsigned i = 0; i < writtenVariablesCount; ++i, ++j) { + m_variables[j] = parameters.writtenVariables[i].get(); + m_variables[j]->ref(); + } +} + +#if COMPILER(MSVC) +#pragma warning(pop) +#endif + } #endif // SourceProviderCacheItem_h |