Use constexpr instead of const in symbol definitions that are obviously constexpr.
[WebKit-https.git] / Source / JavaScriptCore / parser / SourceCodeKey.h
index 2ffe333..678ae9d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2012-2019 Apple Inc. All Rights Reserved.
  * Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>
  *
  * Redistribution and use in source and binary forms, with or without
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef SourceCodeKey_h
-#define SourceCodeKey_h
+#pragma once
 
 #include "ParserModes.h"
-#include "SourceCode.h"
+#include "UnlinkedSourceCode.h"
 #include <wtf/HashTraits.h>
 
 namespace JSC {
@@ -36,17 +35,22 @@ namespace JSC {
 enum class SourceCodeType { EvalType, ProgramType, FunctionType, ModuleType };
 
 class SourceCodeFlags {
+    friend class CachedSourceCodeKey;
+
 public:
     SourceCodeFlags() = default;
 
-    SourceCodeFlags(SourceCodeType codeType, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, DerivedContextType derivedContextType, EvalContextType evalContextType, bool isArrowFunctionContext)
+    SourceCodeFlags(
+        SourceCodeType codeType, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, 
+        DerivedContextType derivedContextType, EvalContextType evalContextType, bool isArrowFunctionContext,
+        OptionSet<CodeGenerationMode> codeGenerationMode)
         : m_flags(
-            (static_cast<unsigned>(scriptMode) << 8) |
-            (static_cast<unsigned>(isArrowFunctionContext) << 7) |
-            (static_cast<unsigned>(evalContextType) << 6) |
-            (static_cast<unsigned>(derivedContextType) << 4) |
-            (static_cast<unsigned>(codeType) << 2) |
-            (static_cast<unsigned>(builtinMode) << 1) |
+            (static_cast<unsigned>(codeGenerationMode.toRaw()) << 6) |
+            (static_cast<unsigned>(scriptMode) << 5) |
+            (static_cast<unsigned>(isArrowFunctionContext) << 4) |
+            (static_cast<unsigned>(evalContextType) << 3) |
+            (static_cast<unsigned>(derivedContextType) << 2) |
+            (static_cast<unsigned>(codeType) << 1) |
             (static_cast<unsigned>(strictMode))
         )
     {
@@ -57,21 +61,29 @@ public:
         return m_flags == rhs.m_flags;
     }
 
+    unsigned bits() { return m_flags; }
+
 private:
     unsigned m_flags { 0 };
 };
 
 class SourceCodeKey {
+    friend class CachedSourceCodeKey;
+
 public:
     SourceCodeKey()
     {
     }
 
-    SourceCodeKey(const SourceCode& sourceCode, const String& name, SourceCodeType codeType, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, DerivedContextType derivedContextType, EvalContextType evalContextType, bool isArrowFunctionContext)
-        : m_sourceCode(sourceCode)
-        , m_name(name)
-        , m_flags(codeType, builtinMode, strictMode, scriptMode, derivedContextType, evalContextType, isArrowFunctionContext)
-        , m_hash(sourceCode.hash())
+    SourceCodeKey(
+        const UnlinkedSourceCode& sourceCode, const String& name, SourceCodeType codeType, JSParserStrictMode strictMode, 
+        JSParserScriptMode scriptMode, DerivedContextType derivedContextType, EvalContextType evalContextType, bool isArrowFunctionContext,
+        OptionSet<CodeGenerationMode> codeGenerationMode, Optional<int> functionConstructorParametersEndPosition)
+            : m_sourceCode(sourceCode)
+            , m_name(name)
+            , m_flags(codeType, strictMode, scriptMode, derivedContextType, evalContextType, isArrowFunctionContext, codeGenerationMode)
+            , m_functionConstructorParametersEndPosition(functionConstructorParametersEndPosition.valueOr(-1))
+            , m_hash(sourceCode.hash() ^ m_flags.bits())
     {
     }
 
@@ -84,6 +96,8 @@ public:
 
     unsigned hash() const { return m_hash; }
 
+    const UnlinkedSourceCode& source() const { return m_sourceCode; }
+
     size_t length() const { return m_sourceCode.length(); }
 
     bool isNull() const { return m_sourceCode.isNull(); }
@@ -92,33 +106,41 @@ public:
     // providers cache their strings to make this efficient.
     StringView string() const { return m_sourceCode.view(); }
 
+    StringView host() const { return m_sourceCode.provider().url().host(); }
+
     bool operator==(const SourceCodeKey& other) const
     {
         return m_hash == other.m_hash
             && length() == other.length()
             && m_flags == other.m_flags
+            && m_functionConstructorParametersEndPosition == other.m_functionConstructorParametersEndPosition
             && m_name == other.m_name
+            && host() == other.host()
             && string() == other.string();
     }
 
+    bool operator!=(const SourceCodeKey& other) const
+    {
+        return !(*this == other);
+    }
+
     struct Hash {
         static unsigned hash(const SourceCodeKey& key) { return key.hash(); }
         static bool equal(const SourceCodeKey& a, const SourceCodeKey& b) { return a == b; }
-        static const bool safeToCompareToEmptyOrDeleted = false;
+        static constexpr bool safeToCompareToEmptyOrDeleted = false;
     };
 
     struct HashTraits : SimpleClassHashTraits<SourceCodeKey> {
-        static const bool hasIsEmptyValueFunction = true;
+        static constexpr bool hasIsEmptyValueFunction = true;
         static bool isEmptyValue(const SourceCodeKey& key) { return key.isNull(); }
     };
 
 private:
-    SourceCode m_sourceCode;
+    UnlinkedSourceCode m_sourceCode;
     String m_name;
     SourceCodeFlags m_flags;
+    int m_functionConstructorParametersEndPosition;
     unsigned m_hash;
 };
 
-}
-
-#endif // SourceCodeKey_h
+} // namespace JSC