| /* | 
 |  * Copyright (C) 2012-2013, 2015-2016 Apple Inc. All rights reserved. | 
 |  * | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions | 
 |  * are met: | 
 |  * 1. Redistributions of source code must retain the above copyright | 
 |  *    notice, this list of conditions and the following disclaimer. | 
 |  * 2. Redistributions in binary form must reproduce the above copyright | 
 |  *    notice, this list of conditions and the following disclaimer in the | 
 |  *    documentation and/or other materials provided with the distribution. | 
 |  * | 
 |  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' | 
 |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | 
 |  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
 |  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS | 
 |  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
 |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
 |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
 |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
 |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
 |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | 
 |  * THE POSSIBILITY OF SUCH DAMAGE. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include "ConstructAbility.h" | 
 | #include "ConstructorKind.h" | 
 | #include "Identifier.h" | 
 |  | 
 | namespace JSC { | 
 |  | 
 | enum class JSParserStrictMode { NotStrict, Strict }; | 
 | enum class JSParserBuiltinMode { NotBuiltin, Builtin }; | 
 | enum class JSParserScriptMode { Classic, Module }; | 
 |  | 
 | enum class SuperBinding { Needed, NotNeeded }; | 
 |  | 
 | enum class CodeGenerationMode : uint8_t { | 
 |     Debugger = 1 << 0, | 
 |     TypeProfiler = 1 << 1, | 
 |     ControlFlowProfiler = 1 << 2, | 
 | }; | 
 |  | 
 | enum class FunctionMode { FunctionExpression, FunctionDeclaration, MethodDefinition }; | 
 |  | 
 | // Keep it less than 32, it means this should be within 5 bits. | 
 | enum class SourceParseMode : uint8_t { | 
 |     NormalFunctionMode                = 0, | 
 |     GeneratorBodyMode                 = 1, | 
 |     GeneratorWrapperFunctionMode      = 2, | 
 |     GetterMode                        = 3, | 
 |     SetterMode                        = 4, | 
 |     MethodMode                        = 5, | 
 |     ArrowFunctionMode                 = 6, | 
 |     AsyncFunctionBodyMode             = 7, | 
 |     AsyncArrowFunctionBodyMode        = 8, | 
 |     AsyncFunctionMode                 = 9, | 
 |     AsyncMethodMode                   = 10, | 
 |     AsyncArrowFunctionMode            = 11, | 
 |     ProgramMode                       = 12, | 
 |     ModuleAnalyzeMode                 = 13, | 
 |     ModuleEvaluateMode                = 14, | 
 |     AsyncGeneratorBodyMode            = 15, | 
 |     AsyncGeneratorWrapperFunctionMode = 16, | 
 |     AsyncGeneratorWrapperMethodMode   = 17, | 
 |     GeneratorWrapperMethodMode        = 18, | 
 |     InstanceFieldInitializerMode      = 19, | 
 | }; | 
 |  | 
 | class SourceParseModeSet {  | 
 | public:  | 
 |     template<typename... Modes>  | 
 |     constexpr SourceParseModeSet(Modes... args) | 
 |         : m_mask(mergeSourceParseModes(args...))  | 
 |     {  | 
 |     }  | 
 |  | 
 |     ALWAYS_INLINE constexpr bool contains(SourceParseMode mode) | 
 |     {  | 
 |         return (1U << static_cast<unsigned>(mode)) & m_mask; | 
 |     }  | 
 |  | 
 | private:  | 
 |     ALWAYS_INLINE static constexpr unsigned mergeSourceParseModes(SourceParseMode mode) | 
 |     {  | 
 |         return (1U << static_cast<unsigned>(mode)); | 
 |     }  | 
 |  | 
 |     template<typename... Rest>  | 
 |     ALWAYS_INLINE static constexpr unsigned mergeSourceParseModes(SourceParseMode mode, Rest... rest) | 
 |     {  | 
 |         return (1U << static_cast<unsigned>(mode)) | mergeSourceParseModes(rest...); | 
 |     }  | 
 |  | 
 |     const unsigned m_mask;  | 
 | };  | 
 |  | 
 | ALWAYS_INLINE bool isFunctionParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     return SourceParseModeSet(  | 
 |         SourceParseMode::NormalFunctionMode,  | 
 |         SourceParseMode::GeneratorBodyMode,  | 
 |         SourceParseMode::GeneratorWrapperFunctionMode,  | 
 |         SourceParseMode::GeneratorWrapperMethodMode, | 
 |         SourceParseMode::GetterMode,  | 
 |         SourceParseMode::SetterMode,  | 
 |         SourceParseMode::MethodMode,  | 
 |         SourceParseMode::ArrowFunctionMode,  | 
 |         SourceParseMode::AsyncFunctionBodyMode,  | 
 |         SourceParseMode::AsyncFunctionMode,  | 
 |         SourceParseMode::AsyncMethodMode,  | 
 |         SourceParseMode::AsyncArrowFunctionMode,  | 
 |         SourceParseMode::AsyncArrowFunctionBodyMode, | 
 |         SourceParseMode::AsyncGeneratorBodyMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperFunctionMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperMethodMode, | 
 |         SourceParseMode::InstanceFieldInitializerMode).contains(parseMode); | 
 | }  | 
 |  | 
 | ALWAYS_INLINE bool isAsyncFunctionParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::AsyncGeneratorWrapperFunctionMode, | 
 |         SourceParseMode::AsyncGeneratorBodyMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperMethodMode, | 
 |         SourceParseMode::AsyncFunctionBodyMode,  | 
 |         SourceParseMode::AsyncFunctionMode,  | 
 |         SourceParseMode::AsyncMethodMode,  | 
 |         SourceParseMode::AsyncArrowFunctionMode,  | 
 |         SourceParseMode::AsyncArrowFunctionBodyMode).contains(parseMode);  | 
 | }  | 
 |  | 
 | ALWAYS_INLINE bool isAsyncArrowFunctionParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     return SourceParseModeSet(  | 
 |         SourceParseMode::AsyncArrowFunctionMode, | 
 |         SourceParseMode::AsyncArrowFunctionBodyMode).contains(parseMode);  | 
 | }  | 
 |  | 
 | ALWAYS_INLINE bool isAsyncGeneratorParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::AsyncGeneratorWrapperFunctionMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperMethodMode, | 
 |         SourceParseMode::AsyncGeneratorBodyMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isAsyncGeneratorWrapperParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::AsyncGeneratorWrapperFunctionMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperMethodMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isAsyncFunctionOrAsyncGeneratorWrapperParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::AsyncArrowFunctionMode, | 
 |         SourceParseMode::AsyncFunctionMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperFunctionMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperMethodMode, | 
 |         SourceParseMode::AsyncMethodMode).contains(parseMode); | 
 |     } | 
 |      | 
 | ALWAYS_INLINE bool isAsyncFunctionWrapperParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     return SourceParseModeSet(  | 
 |         SourceParseMode::AsyncArrowFunctionMode,  | 
 |         SourceParseMode::AsyncFunctionMode, | 
 |         SourceParseMode::AsyncMethodMode).contains(parseMode);  | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isAsyncFunctionBodyParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     return SourceParseModeSet(  | 
 |         SourceParseMode::AsyncFunctionBodyMode, | 
 |         SourceParseMode::AsyncGeneratorBodyMode, | 
 |         SourceParseMode::AsyncArrowFunctionBodyMode).contains(parseMode);  | 
 | } | 
 |      | 
 | ALWAYS_INLINE bool isGeneratorMethodParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::GeneratorWrapperMethodMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isAsyncMethodParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet(SourceParseMode::AsyncMethodMode).contains(parseMode); | 
 | } | 
 |      | 
 | ALWAYS_INLINE bool isAsyncGeneratorMethodParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet(SourceParseMode::AsyncGeneratorWrapperMethodMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isMethodParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::GeneratorWrapperMethodMode, | 
 |         SourceParseMode::GetterMode, | 
 |         SourceParseMode::SetterMode, | 
 |         SourceParseMode::MethodMode, | 
 |         SourceParseMode::AsyncMethodMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperMethodMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isGeneratorOrAsyncFunctionBodyParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::GeneratorBodyMode, | 
 |         SourceParseMode::AsyncFunctionBodyMode, | 
 |         SourceParseMode::AsyncGeneratorBodyMode, | 
 |         SourceParseMode::AsyncArrowFunctionBodyMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isGeneratorOrAsyncFunctionWrapperParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::GeneratorWrapperFunctionMode, | 
 |         SourceParseMode::GeneratorWrapperMethodMode, | 
 |         SourceParseMode::AsyncFunctionMode, | 
 |         SourceParseMode::AsyncArrowFunctionMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperFunctionMode, | 
 |         SourceParseMode::AsyncMethodMode, | 
 |         SourceParseMode::AsyncGeneratorWrapperMethodMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isGeneratorParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::GeneratorBodyMode, | 
 |         SourceParseMode::GeneratorWrapperFunctionMode, | 
 |         SourceParseMode::GeneratorWrapperMethodMode).contains(parseMode);     | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isGeneratorWrapperParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::GeneratorWrapperFunctionMode, | 
 |         SourceParseMode::GeneratorWrapperMethodMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isArrowFunctionParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::ArrowFunctionMode, | 
 |         SourceParseMode::AsyncArrowFunctionMode, | 
 |         SourceParseMode::AsyncArrowFunctionBodyMode).contains(parseMode); | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isModuleParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     return SourceParseModeSet(  | 
 |         SourceParseMode::ModuleAnalyzeMode,  | 
 |         SourceParseMode::ModuleEvaluateMode).contains(parseMode);  | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isProgramParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     return SourceParseModeSet(SourceParseMode::ProgramMode).contains(parseMode);  | 
 | } | 
 |  | 
 | ALWAYS_INLINE bool isProgramOrModuleParseMode(SourceParseMode parseMode) | 
 | { | 
 |     return SourceParseModeSet( | 
 |         SourceParseMode::ProgramMode,  | 
 |         SourceParseMode::ModuleAnalyzeMode,  | 
 |         SourceParseMode::ModuleEvaluateMode).contains(parseMode);  | 
 | } | 
 |  | 
 | ALWAYS_INLINE ConstructAbility constructAbilityForParseMode(SourceParseMode parseMode)  | 
 | {  | 
 |     if (parseMode == SourceParseMode::NormalFunctionMode)  | 
 |         return ConstructAbility::CanConstruct; | 
 |  | 
 |     return ConstructAbility::CannotConstruct; | 
 | } | 
 |  | 
 | inline bool functionNameIsInScope(const Identifier& name, FunctionMode functionMode) | 
 | { | 
 |     if (name.isNull()) | 
 |         return false; | 
 |  | 
 |     if (functionMode != FunctionMode::FunctionExpression) | 
 |         return false; | 
 |  | 
 |     return true; | 
 | } | 
 |  | 
 | inline bool functionNameScopeIsDynamic(bool usesEval, bool isStrictMode) | 
 | { | 
 |     // If non-strict eval is in play, a function gets a separate object in the scope chain for its name. | 
 |     // This enables eval to declare and then delete a name that shadows the function's name. | 
 |  | 
 |     if (!usesEval) | 
 |         return false; | 
 |  | 
 |     if (isStrictMode) | 
 |         return false; | 
 |  | 
 |     return true; | 
 | } | 
 |  | 
 | typedef uint16_t CodeFeatures; | 
 |  | 
 | const CodeFeatures NoFeatures =                       0; | 
 | const CodeFeatures EvalFeature =                 1 << 0; | 
 | const CodeFeatures ArgumentsFeature =            1 << 1; | 
 | const CodeFeatures WithFeature =                 1 << 2; | 
 | const CodeFeatures ThisFeature =                 1 << 3; | 
 | const CodeFeatures StrictModeFeature =           1 << 4; | 
 | const CodeFeatures ShadowsArgumentsFeature =     1 << 5; | 
 | const CodeFeatures ArrowFunctionFeature =        1 << 6; | 
 | const CodeFeatures ArrowFunctionContextFeature = 1 << 7; | 
 | const CodeFeatures SuperCallFeature =            1 << 8; | 
 | const CodeFeatures SuperPropertyFeature =        1 << 9; | 
 | const CodeFeatures NewTargetFeature =            1 << 10; | 
 | const CodeFeatures NoEvalCacheFeature =          1 << 11; | 
 |  | 
 | const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ArrowFunctionFeature | ArrowFunctionContextFeature | | 
 |     SuperCallFeature | SuperPropertyFeature | NewTargetFeature | NoEvalCacheFeature; | 
 |  | 
 | typedef uint8_t InnerArrowFunctionCodeFeatures; | 
 |      | 
 | const InnerArrowFunctionCodeFeatures NoInnerArrowFunctionFeatures =                0; | 
 | const InnerArrowFunctionCodeFeatures EvalInnerArrowFunctionFeature =          1 << 0; | 
 | const InnerArrowFunctionCodeFeatures ArgumentsInnerArrowFunctionFeature =     1 << 1; | 
 | const InnerArrowFunctionCodeFeatures ThisInnerArrowFunctionFeature =          1 << 2; | 
 | const InnerArrowFunctionCodeFeatures SuperCallInnerArrowFunctionFeature =     1 << 3; | 
 | const InnerArrowFunctionCodeFeatures SuperPropertyInnerArrowFunctionFeature = 1 << 4; | 
 | const InnerArrowFunctionCodeFeatures NewTargetInnerArrowFunctionFeature =     1 << 5; | 
 |      | 
 | const InnerArrowFunctionCodeFeatures AllInnerArrowFunctionCodeFeatures = EvalInnerArrowFunctionFeature | ArgumentsInnerArrowFunctionFeature | ThisInnerArrowFunctionFeature | SuperCallInnerArrowFunctionFeature | SuperPropertyInnerArrowFunctionFeature | NewTargetInnerArrowFunctionFeature; | 
 | static_assert(AllInnerArrowFunctionCodeFeatures <= 0b111111, "InnerArrowFunctionCodeFeatures must be 6bits"); | 
 | } // namespace JSC |