X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..ef99ff287df9046eb88937225e0554eabb00e33c:/parser/SourceProviderCacheItem.h diff --git a/parser/SourceProviderCacheItem.h b/parser/SourceProviderCacheItem.h index 3662367..3962118 100644 --- a/parser/SourceProviderCacheItem.h +++ b/parser/SourceProviderCacheItem.h @@ -27,47 +27,111 @@ #define SourceProviderCacheItem_h #include "ParserTokens.h" +#include #include #include namespace JSC { +struct SourceProviderCacheItemCreationParameters { + unsigned functionNameStart; + unsigned closeBraceLine; + unsigned closeBraceOffset; + unsigned closeBraceLineStartOffset; + bool needsFullActivation; + bool usesEval; + bool strictMode; + Vector> usedVariables; + Vector> 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(int closeBraceLine, int closeBracePos) - : 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) + 2; - unsigned size = sizeof(*this); - size += usedVariables.size() * assummedAverageIdentifierSize; - size += writtenVariables.size() * assummedAverageIdentifierSize; - return size; - } + static std::unique_ptr create(const SourceProviderCacheItemCreationParameters&); + ~SourceProviderCacheItem(); + JSToken closeBraceToken() const { JSToken token; token.m_type = CLOSEBRACE; - token.m_data.intValue = closeBracePos; - token.m_info.startOffset = closeBracePos; - token.m_info.endOffset = closeBracePos + 1; - token.m_info.line = closeBraceLine; + 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; } + + unsigned functionNameStart : 31; + bool needsFullActivation : 1; - int closeBraceLine; - int closeBracePos; - bool usesEval; - bool strictMode; - bool needsFullActivation; - Vector > usedVariables; - Vector > writtenVariables; + unsigned closeBraceLine : 31; + bool usesEval : 1; + + unsigned closeBraceOffset : 31; + bool strictMode : 1; + + unsigned closeBraceLineStartOffset; + unsigned usedVariablesCount; + unsigned writtenVariablesCount; + + StringImpl** usedVariables() const { return const_cast(m_variables); } + StringImpl** writtenVariables() const { return const_cast(&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 std::unique_ptr 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 std::unique_ptr(new (slot) SourceProviderCacheItem(parameters)); +} + +inline SourceProviderCacheItem::SourceProviderCacheItem(const SourceProviderCacheItemCreationParameters& parameters) + : functionNameStart(parameters.functionNameStart) + , 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