Changeset 237054 in webkit for trunk/Source/JavaScriptCore/parser/Parser.h
- Timestamp:
- Oct 11, 2018, 4:43:58 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/parser/Parser.h
r233377 r237054 860 860 }; 861 861 862 enum class ArgumentType { 863 Normal, 864 Spread 865 }; 862 enum class ArgumentType { Normal, Spread }; 863 enum class ParsingContext { Program, FunctionConstructor, Eval }; 866 864 867 865 template <typename LexerType> … … 875 873 876 874 template <class ParsedNode> 877 std::unique_ptr<ParsedNode> parse(ParserError&, const Identifier&, SourceParseMode );875 std::unique_ptr<ParsedNode> parse(ParserError&, const Identifier&, SourceParseMode, ParsingContext, std::optional<int> functionConstructorParametersEndPosition = std::nullopt); 878 876 879 877 JSTextPosition positionBeforeLastNewline() const { return m_lexer->positionBeforeLastNewline(); } … … 1313 1311 1314 1312 Parser(); 1315 String parseInner(const Identifier&, SourceParseMode); 1313 1314 String parseInner(const Identifier&, SourceParseMode, ParsingContext, std::optional<int> functionConstructorParametersEndPosition = std::nullopt); 1316 1315 1317 1316 void didFinishParsing(SourceElements*, DeclarationStacks::FunctionStack&&, VariableEnvironment&, UniquedStringImplPtrSet&&, CodeFeatures, int); … … 1525 1524 template <class TreeBuilder> TreeSourceElements parseAsyncFunctionSourceElements(TreeBuilder&, SourceParseMode, bool isArrowFunctionBodyExpression, SourceElementsMode); 1526 1525 template <class TreeBuilder> TreeSourceElements parseAsyncGeneratorFunctionSourceElements(TreeBuilder&, SourceParseMode, bool isArrowFunctionBodyExpression, SourceElementsMode); 1526 template <class TreeBuilder> TreeSourceElements parseSingleFunction(TreeBuilder&, std::optional<int> functionConstructorParametersEndPosition); 1527 1527 template <class TreeBuilder> TreeStatement parseStatementListItem(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength); 1528 1528 template <class TreeBuilder> TreeStatement parseStatement(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength = 0); 1529 1529 enum class ExportType { Exported, NotExported }; 1530 1530 template <class TreeBuilder> TreeStatement parseClassDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard); 1531 template <class TreeBuilder> TreeStatement parseFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard );1531 template <class TreeBuilder> TreeStatement parseFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard, std::optional<int> functionConstructorParametersEndPosition = std::nullopt); 1532 1532 template <class TreeBuilder> TreeStatement parseFunctionDeclarationStatement(TreeBuilder&, bool isAsync, bool parentAllowsFunctionDeclarationAsStatement); 1533 template <class TreeBuilder> TreeStatement parseAsyncFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard );1533 template <class TreeBuilder> TreeStatement parseAsyncFunctionDeclaration(TreeBuilder&, ExportType = ExportType::NotExported, DeclarationDefaultContext = DeclarationDefaultContext::Standard, std::optional<int> functionConstructorParametersEndPosition = std::nullopt); 1534 1534 template <class TreeBuilder> NEVER_INLINE bool maybeParseAsyncFunctionDeclarationStatement(TreeBuilder& context, TreeStatement& result, bool parentAllowsFunctionDeclarationAsStatement); 1535 1535 template <class TreeBuilder> TreeStatement parseVariableDeclaration(TreeBuilder&, DeclarationType, ExportType = ExportType::NotExported); … … 1600 1600 1601 1601 enum class FunctionDefinitionType { Expression, Declaration, Method }; 1602 template <class TreeBuilder> NEVER_INLINE bool parseFunctionInfo(TreeBuilder&, FunctionNameRequirements, SourceParseMode, bool nameIsInContainingScope, ConstructorKind, SuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>&, FunctionDefinitionType );1602 template <class TreeBuilder> NEVER_INLINE bool parseFunctionInfo(TreeBuilder&, FunctionNameRequirements, SourceParseMode, bool nameIsInContainingScope, ConstructorKind, SuperBinding, int functionKeywordStart, ParserFunctionInfo<TreeBuilder>&, FunctionDefinitionType, std::optional<int> functionConstructorParametersEndPosition = std::nullopt); 1603 1603 1604 1604 ALWAYS_INLINE bool isArrowFunctionParameters(); … … 1849 1849 template <typename LexerType> 1850 1850 template <class ParsedNode> 1851 std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error, const Identifier& calleeName, SourceParseMode parseMode )1851 std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error, const Identifier& calleeName, SourceParseMode parseMode, ParsingContext parsingContext, std::optional<int> functionConstructorParametersEndPosition) 1852 1852 { 1853 1853 int errLine; … … 1866 1866 unsigned startColumn = m_source->startColumn().zeroBasedInt(); 1867 1867 1868 String parseError = parseInner(calleeName, parseMode );1868 String parseError = parseInner(calleeName, parseMode, parsingContext, functionConstructorParametersEndPosition); 1869 1869 1870 1870 int lineNumber = m_lexer->lineNumber(); … … 1961 1961 if (source.provider()->source().is8Bit()) { 1962 1962 Parser<Lexer<LChar>> parser(vm, source, builtinMode, strictMode, scriptMode, parseMode, superBinding, defaultConstructorKind, derivedContextType, isEvalNode<ParsedNode>(), evalContextType, debuggerParseData); 1963 result = parser.parse<ParsedNode>(error, name, parseMode );1963 result = parser.parse<ParsedNode>(error, name, parseMode, isEvalNode<ParsedNode>() ? ParsingContext::Eval : ParsingContext::Program); 1964 1964 if (positionBeforeLastNewline) 1965 1965 *positionBeforeLastNewline = parser.positionBeforeLastNewline(); … … 1974 1974 ASSERT_WITH_MESSAGE(defaultConstructorKind == ConstructorKind::None, "BuiltinExecutables::createDefaultConstructor should always use a 8-bit string"); 1975 1975 Parser<Lexer<UChar>> parser(vm, source, builtinMode, strictMode, scriptMode, parseMode, superBinding, defaultConstructorKind, derivedContextType, isEvalNode<ParsedNode>(), evalContextType, debuggerParseData); 1976 result = parser.parse<ParsedNode>(error, name, parseMode );1976 result = parser.parse<ParsedNode>(error, name, parseMode, isEvalNode<ParsedNode>() ? ParsingContext::Eval : ParsingContext::Program); 1977 1977 if (positionBeforeLastNewline) 1978 1978 *positionBeforeLastNewline = parser.positionBeforeLastNewline(); … … 1988 1988 } 1989 1989 1990 inline std::unique_ptr<ProgramNode> parseFunctionForFunctionConstructor(VM& vm, const SourceCode& source, ParserError& error, JSTextPosition* positionBeforeLastNewline, std::optional<int> functionConstructorParametersEndPosition) 1991 { 1992 ASSERT(!source.provider()->source().isNull()); 1993 1994 MonotonicTime before; 1995 if (UNLIKELY(Options::reportParseTimes())) 1996 before = MonotonicTime::now(); 1997 1998 Identifier name; 1999 bool isEvalNode = false; 2000 std::unique_ptr<ProgramNode> result; 2001 if (source.provider()->source().is8Bit()) { 2002 Parser<Lexer<LChar>> parser(&vm, source, JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::NotStrict, JSParserScriptMode::Classic, SourceParseMode::ProgramMode, SuperBinding::NotNeeded, ConstructorKind::None, DerivedContextType::None, isEvalNode, EvalContextType::None, nullptr); 2003 result = parser.parse<ProgramNode>(error, name, SourceParseMode::ProgramMode, ParsingContext::FunctionConstructor, functionConstructorParametersEndPosition); 2004 if (positionBeforeLastNewline) 2005 *positionBeforeLastNewline = parser.positionBeforeLastNewline(); 2006 } else { 2007 Parser<Lexer<UChar>> parser(&vm, source, JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::NotStrict, JSParserScriptMode::Classic, SourceParseMode::ProgramMode, SuperBinding::NotNeeded, ConstructorKind::None, DerivedContextType::None, isEvalNode, EvalContextType::None, nullptr); 2008 result = parser.parse<ProgramNode>(error, name, SourceParseMode::ProgramMode, ParsingContext::FunctionConstructor, functionConstructorParametersEndPosition); 2009 if (positionBeforeLastNewline) 2010 *positionBeforeLastNewline = parser.positionBeforeLastNewline(); 2011 } 2012 2013 if (UNLIKELY(Options::reportParseTimes())) { 2014 MonotonicTime after = MonotonicTime::now(); 2015 ParseHash hash(source); 2016 dataLogLn(result ? "Parsed #" : "Failed to parse #", hash.hashForCall(), "/#", hash.hashForConstruct(), " in ", (after - before).milliseconds(), " ms."); 2017 } 2018 2019 return result; 2020 } 2021 2022 1990 2023 } // namespace
Note:
See TracChangeset
for help on using the changeset viewer.