]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - parser/SourceProviderCacheItem.h
JavaScriptCore-7600.1.4.13.1.tar.gz
[apple/javascriptcore.git] / parser / SourceProviderCacheItem.h
index b9ab225ea95e6abf346fd2181df0617f0985c457..3962118610f6aa6a8f4905a90eb2daa4a0085eeb 100644 (file)
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "JSParser.h"
+#ifndef SourceProviderCacheItem_h
+#define SourceProviderCacheItem_h
+
+#include "ParserTokens.h"
+#include <wtf/PassOwnPtr.h>
 #include <wtf/Vector.h>
 #include <wtf/text/WTFString.h>
 
 namespace JSC {
 
+struct SourceProviderCacheItemCreationParameters {
+    unsigned functionNameStart;
+    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(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<StringImpl>) + 2;
-        unsigned size = sizeof(*this);
-        size += usedVariables.size() * assummedAverageIdentifierSize;
-        size += writtenVariables.size() * assummedAverageIdentifierSize;
-        return size;
-    }
+    static std::unique_ptr<SourceProviderCacheItem> 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;
-    Vector<RefPtr<StringImpl> > usedVariables;
-    Vector<RefPtr<StringImpl> > 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<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 std::unique_ptr<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 std::unique_ptr<SourceProviderCacheItem>(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