Ignore:
Timestamp:
Nov 8, 2011, 2:49:27 PM (14 years ago)
Author:
[email protected]
Message:

Towards 8 Bit Strings: Templatize JSC::Parser class by Lexer type
https://bugs.webkit.org/show_bug.cgi?id=71761

Source/JavaScriptCore:

Templatized Parser based on Lexer<T>. Moved two enums,
SourceElementsMode and FunctionRequirements out of Parser definition
to work around a clang compiler defect.

Cleaned up SourceCode data() to return StringImpl* and eliminated
the recently added stringData() virtual method.

To keep code in Parser.cpp and keep Parser.h small, the two flavors
of Parser are explicitly instantiated at the end of Parser.cpp.

Reviewed by Gavin Barraclough.

  • interpreter/Interpreter.cpp:

(JSC::appendSourceToError):

  • parser/Lexer.cpp:

(JSC::::setCode):
(JSC::::sourceCode):

  • parser/Parser.cpp:

(JSC::::Parser):
(JSC::::~Parser):
(JSC::::parseInner):
(JSC::::didFinishParsing):
(JSC::::allowAutomaticSemicolon):
(JSC::::parseSourceElements):
(JSC::::parseVarDeclaration):
(JSC::::parseConstDeclaration):
(JSC::::parseDoWhileStatement):
(JSC::::parseWhileStatement):
(JSC::::parseVarDeclarationList):
(JSC::::parseConstDeclarationList):
(JSC::::parseForStatement):
(JSC::::parseBreakStatement):
(JSC::::parseContinueStatement):
(JSC::::parseReturnStatement):
(JSC::::parseThrowStatement):
(JSC::::parseWithStatement):
(JSC::::parseSwitchStatement):
(JSC::::parseSwitchClauses):
(JSC::::parseSwitchDefaultClause):
(JSC::::parseTryStatement):
(JSC::::parseDebuggerStatement):
(JSC::::parseBlockStatement):
(JSC::::parseStatement):
(JSC::::parseFormalParameters):
(JSC::::parseFunctionBody):
(JSC::::parseFunctionInfo):
(JSC::::parseFunctionDeclaration):
(JSC::::parseExpressionOrLabelStatement):
(JSC::::parseExpressionStatement):
(JSC::::parseIfStatement):
(JSC::::parseExpression):
(JSC::::parseAssignmentExpression):
(JSC::::parseConditionalExpression):
(JSC::::isBinaryOperator):
(JSC::::parseBinaryExpression):
(JSC::::parseProperty):
(JSC::::parseObjectLiteral):
(JSC::::parseStrictObjectLiteral):
(JSC::::parseArrayLiteral):
(JSC::::parsePrimaryExpression):
(JSC::::parseArguments):
(JSC::::parseMemberExpression):
(JSC::::parseUnaryExpression):

  • parser/Parser.h:

(JSC::::parse):
(JSC::parse):

  • parser/SourceCode.h:

(JSC::SourceCode::data):
(JSC::SourceCode::subExpression):

  • parser/SourceProvider.h:

(JSC::UStringSourceProvider::data):

Source/WebCore:

Cleaned up SourceCode data() to return StringImpl* and eliminated
the recently added stringData() virtual method.

No tests added - refactored base class SourceCode and its subclasses.

  • bindings/js/CachedScriptSourceProvider.h:

(WebCore::CachedScriptSourceProvider::data):

  • bindings/js/ScriptDebugServer.cpp:

(WebCore::ScriptDebugServer::dispatchDidParseSource):
(WebCore::ScriptDebugServer::dispatchFailedToParseSource):

  • bindings/js/StringSourceProvider.h:

(WebCore::StringSourceProvider::data):

Source/WebKit/mac:

Changed WKPCEvaluate() to use emptyString() when the source is
zero length.

Reviewed by Gavin Barraclough.

  • Plugins/Hosted/NetscapePluginHostProxy.mm:

(WKPCEvaluate):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r99608 r99618  
    4141namespace JSC {
    4242
    43 Parser::Parser(JSGlobalData* globalData, const SourceCode& source, FunctionParameters* parameters, JSParserStrictness strictness, JSParserMode parserMode)
     43template <typename LexerType>
     44Parser<LexerType>::Parser(JSGlobalData* globalData, const SourceCode& source, FunctionParameters* parameters, JSParserStrictness strictness, JSParserMode parserMode)
    4445    : m_globalData(globalData)
    4546    , m_source(&source)
     
    5859    , m_sourceElements(0)
    5960{
    60     m_lexer = adoptPtr(new Lexer<UChar>(globalData));
     61    m_lexer = adoptPtr(new LexerType(globalData));
    6162    m_arena = m_globalData->parserArena;
    6263    m_lexer->setCode(source, m_arena);
     
    7677}
    7778
    78 Parser::~Parser()
    79 {
    80 }
    81 
    82 
    83 UString Parser::parseInner()
     79template <typename LexerType>
     80Parser<LexerType>::~Parser()
     81{
     82}
     83
     84template <typename LexerType>
     85UString Parser<LexerType>::parseInner()
    8486{
    8587    UString parseError = UString();
     
    111113}
    112114
    113 void Parser::didFinishParsing(SourceElements* sourceElements, ParserArenaData<DeclarationStacks::VarStack>* varStack,
     115template <typename LexerType>
     116void Parser<LexerType>::didFinishParsing(SourceElements* sourceElements, ParserArenaData<DeclarationStacks::VarStack>* varStack,
    114117                              ParserArenaData<DeclarationStacks::FunctionStack>* funcStack, CodeFeatures features, int lastLine, int numConstants, IdentifierSet& capturedVars)
    115118{
     
    123126}
    124127
    125 bool Parser::allowAutomaticSemicolon()
     128template <typename LexerType>
     129bool Parser<LexerType>::allowAutomaticSemicolon()
    126130{
    127131    return match(CLOSEBRACE) || match(EOFTOK) || m_lexer->prevTerminator();
    128132}
    129133
    130 template <Parser::SourceElementsMode mode, class TreeBuilder> TreeSourceElements Parser::parseSourceElements(TreeBuilder& context)
     134template <typename LexerType>
     135template <SourceElementsMode mode, class TreeBuilder> TreeSourceElements Parser<LexerType>::parseSourceElements(TreeBuilder& context)
    131136{
    132137    const unsigned lengthOfUseStrictLiteral = 12; // "use strict".length
     
    165170}
    166171
    167 template <class TreeBuilder> TreeStatement Parser::parseVarDeclaration(TreeBuilder& context)
     172template <typename LexerType>
     173template <class TreeBuilder> TreeStatement Parser<LexerType>::parseVarDeclaration(TreeBuilder& context)
    168174{
    169175    ASSERT(match(VAR));
     
    181187}
    182188
    183 template <class TreeBuilder> TreeStatement Parser::parseConstDeclaration(TreeBuilder& context)
     189template <typename LexerType>
     190template <class TreeBuilder> TreeStatement Parser<LexerType>::parseConstDeclaration(TreeBuilder& context)
    184191{
    185192    ASSERT(match(CONSTTOKEN));
     
    193200}
    194201
    195 template <class TreeBuilder> TreeStatement Parser::parseDoWhileStatement(TreeBuilder& context)
     202template <typename LexerType>
     203template <class TreeBuilder> TreeStatement Parser<LexerType>::parseDoWhileStatement(TreeBuilder& context)
    196204{
    197205    ASSERT(match(DO));
     
    214222}
    215223
    216 template <class TreeBuilder> TreeStatement Parser::parseWhileStatement(TreeBuilder& context)
     224template <typename LexerType>
     225template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWhileStatement(TreeBuilder& context)
    217226{
    218227    ASSERT(match(WHILE));
     
    232241}
    233242
    234 template <class TreeBuilder> TreeExpression Parser::parseVarDeclarationList(TreeBuilder& context, int& declarations, const Identifier*& lastIdent, TreeExpression& lastInitializer, int& identStart, int& initStart, int& initEnd)
     243template <typename LexerType>
     244template <class TreeBuilder> TreeExpression Parser<LexerType>::parseVarDeclarationList(TreeBuilder& context, int& declarations, const Identifier*& lastIdent, TreeExpression& lastInitializer, int& identStart, int& initStart, int& initEnd)
    235245{
    236246    TreeExpression varDecls = 0;
     
    268278}
    269279
    270 template <class TreeBuilder> TreeConstDeclList Parser::parseConstDeclarationList(TreeBuilder& context)
     280template <typename LexerType>
     281template <class TreeBuilder> TreeConstDeclList Parser<LexerType>::parseConstDeclarationList(TreeBuilder& context)
    271282{
    272283    failIfTrue(strictMode());
     
    293304}
    294305
    295 template <class TreeBuilder> TreeStatement Parser::parseForStatement(TreeBuilder& context)
     306template <typename LexerType>
     307template <class TreeBuilder> TreeStatement Parser<LexerType>::parseForStatement(TreeBuilder& context)
    296308{
    297309    ASSERT(match(FOR));
     
    401413}
    402414
    403 template <class TreeBuilder> TreeStatement Parser::parseBreakStatement(TreeBuilder& context)
     415template <typename LexerType>
     416template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBreakStatement(TreeBuilder& context)
    404417{
    405418    ASSERT(match(BREAK));
     
    424437}
    425438
    426 template <class TreeBuilder> TreeStatement Parser::parseContinueStatement(TreeBuilder& context)
     439template <typename LexerType>
     440template <class TreeBuilder> TreeStatement Parser<LexerType>::parseContinueStatement(TreeBuilder& context)
    427441{
    428442    ASSERT(match(CONTINUE));
     
    449463}
    450464
    451 template <class TreeBuilder> TreeStatement Parser::parseReturnStatement(TreeBuilder& context)
     465template <typename LexerType>
     466template <class TreeBuilder> TreeStatement Parser<LexerType>::parseReturnStatement(TreeBuilder& context)
    452467{
    453468    ASSERT(match(RETURN));
     
    474489}
    475490
    476 template <class TreeBuilder> TreeStatement Parser::parseThrowStatement(TreeBuilder& context)
     491template <typename LexerType>
     492template <class TreeBuilder> TreeStatement Parser<LexerType>::parseThrowStatement(TreeBuilder& context)
    477493{
    478494    ASSERT(match(THROW));
     
    492508}
    493509
    494 template <class TreeBuilder> TreeStatement Parser::parseWithStatement(TreeBuilder& context)
     510template <typename LexerType>
     511template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWithStatement(TreeBuilder& context)
    495512{
    496513    ASSERT(match(WITH));
     
    514531}
    515532
    516 template <class TreeBuilder> TreeStatement Parser::parseSwitchStatement(TreeBuilder& context)
     533template <typename LexerType>
     534template <class TreeBuilder> TreeStatement Parser<LexerType>::parseSwitchStatement(TreeBuilder& context)
    517535{
    518536    ASSERT(match(SWITCH));
     
    541559}
    542560
    543 template <class TreeBuilder> TreeClauseList Parser::parseSwitchClauses(TreeBuilder& context)
     561template <typename LexerType>
     562template <class TreeBuilder> TreeClauseList Parser<LexerType>::parseSwitchClauses(TreeBuilder& context)
    544563{
    545564    if (!match(CASE))
     
    568587}
    569588
    570 template <class TreeBuilder> TreeClause Parser::parseSwitchDefaultClause(TreeBuilder& context)
     589template <typename LexerType>
     590template <class TreeBuilder> TreeClause Parser<LexerType>::parseSwitchDefaultClause(TreeBuilder& context)
    571591{
    572592    if (!match(DEFAULT))
     
    579599}
    580600
    581 template <class TreeBuilder> TreeStatement Parser::parseTryStatement(TreeBuilder& context)
     601template <typename LexerType>
     602template <class TreeBuilder> TreeStatement Parser<LexerType>::parseTryStatement(TreeBuilder& context)
    582603{
    583604    ASSERT(match(TRY));
     
    624645}
    625646
    626 template <class TreeBuilder> TreeStatement Parser::parseDebuggerStatement(TreeBuilder& context)
     647template <typename LexerType>
     648template <class TreeBuilder> TreeStatement Parser<LexerType>::parseDebuggerStatement(TreeBuilder& context)
    627649{
    628650    ASSERT(match(DEBUGGER));
     
    636658}
    637659
    638 template <class TreeBuilder> TreeStatement Parser::parseBlockStatement(TreeBuilder& context)
     660template <typename LexerType>
     661template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBlockStatement(TreeBuilder& context)
    639662{
    640663    ASSERT(match(OPENBRACE));
     
    652675}
    653676
    654 template <class TreeBuilder> TreeStatement Parser::parseStatement(TreeBuilder& context, const Identifier*& directive, unsigned* directiveLiteralLength)
     677template <typename LexerType>
     678template <class TreeBuilder> TreeStatement Parser<LexerType>::parseStatement(TreeBuilder& context, const Identifier*& directive, unsigned* directiveLiteralLength)
    655679{
    656680    DepthManager statementDepth(&m_statementDepth);
     
    717741}
    718742
    719 template <class TreeBuilder> TreeFormalParameterList Parser::parseFormalParameters(TreeBuilder& context)
     743template <typename LexerType>
     744template <class TreeBuilder> TreeFormalParameterList Parser<LexerType>::parseFormalParameters(TreeBuilder& context)
    720745{
    721746    matchOrFail(IDENT);
     
    735760}
    736761
    737 template <class TreeBuilder> TreeFunctionBody Parser::parseFunctionBody(TreeBuilder& context)
     762template <typename LexerType>
     763template <class TreeBuilder> TreeFunctionBody Parser<LexerType>::parseFunctionBody(TreeBuilder& context)
    738764{
    739765    if (match(CLOSEBRACE))
     
    746772}
    747773
    748 template <Parser::FunctionRequirements requirements, bool nameIsInContainingScope, class TreeBuilder> bool Parser::parseFunctionInfo(TreeBuilder& context, const Identifier*& name, TreeFormalParameterList& parameters, TreeFunctionBody& body, int& openBracePos, int& closeBracePos, int& bodyStartLine)
     774template <typename LexerType>
     775template <FunctionRequirements requirements, bool nameIsInContainingScope, class TreeBuilder> bool Parser<LexerType>::parseFunctionInfo(TreeBuilder& context, const Identifier*& name, TreeFormalParameterList& parameters, TreeFunctionBody& body, int& openBracePos, int& closeBracePos, int& bodyStartLine)
    749776{
    750777    AutoPopScopeRef functionScope(this, pushScope());
     
    819846}
    820847
    821 template <class TreeBuilder> TreeStatement Parser::parseFunctionDeclaration(TreeBuilder& context)
     848template <typename LexerType>
     849template <class TreeBuilder> TreeStatement Parser<LexerType>::parseFunctionDeclaration(TreeBuilder& context)
    822850{
    823851    ASSERT(match(FUNCTION));
     
    848876};
    849877
    850 template <class TreeBuilder> TreeStatement Parser::parseExpressionOrLabelStatement(TreeBuilder& context)
     878template <typename LexerType>
     879template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionOrLabelStatement(TreeBuilder& context)
    851880{
    852881   
     
    910939}
    911940
    912 template <class TreeBuilder> TreeStatement Parser::parseExpressionStatement(TreeBuilder& context)
     941template <typename LexerType>
     942template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionStatement(TreeBuilder& context)
    913943{
    914944    int startLine = tokenLine();
     
    919949}
    920950
    921 template <class TreeBuilder> TreeStatement Parser::parseIfStatement(TreeBuilder& context)
     951template <typename LexerType>
     952template <class TreeBuilder> TreeStatement Parser<LexerType>::parseIfStatement(TreeBuilder& context)
    922953{
    923954    ASSERT(match(IF));
     
    9961027}
    9971028
    998 template <class TreeBuilder> TreeExpression Parser::parseExpression(TreeBuilder& context)
     1029template <typename LexerType>
     1030template <class TreeBuilder> TreeExpression Parser<LexerType>::parseExpression(TreeBuilder& context)
    9991031{
    10001032    failIfStackOverflow();
     
    10181050}
    10191051
    1020 
    1021 template <typename TreeBuilder> TreeExpression Parser::parseAssignmentExpression(TreeBuilder& context)
     1052template <typename LexerType>
     1053template <typename TreeBuilder> TreeExpression Parser<LexerType>::parseAssignmentExpression(TreeBuilder& context)
    10221054{
    10231055    failIfStackOverflow();
     
    10801112}
    10811113
    1082 template <class TreeBuilder> TreeExpression Parser::parseConditionalExpression(TreeBuilder& context)
     1114template <typename LexerType>
     1115template <class TreeBuilder> TreeExpression Parser<LexerType>::parseConditionalExpression(TreeBuilder& context)
    10831116{
    10841117    TreeExpression cond = parseBinaryExpression(context);
     
    11021135}
    11031136
    1104 int Parser::isBinaryOperator(JSTokenType token)
     1137template <typename LexerType>
     1138int Parser<LexerType>::isBinaryOperator(JSTokenType token)
    11051139{
    11061140    if (m_allowsIn)
     
    11091143}
    11101144
    1111 template <class TreeBuilder> TreeExpression Parser::parseBinaryExpression(TreeBuilder& context)
     1145template <typename LexerType>
     1146template <class TreeBuilder> TreeExpression Parser<LexerType>::parseBinaryExpression(TreeBuilder& context)
    11121147{
    11131148   
     
    11531188}
    11541189
    1155 
    1156 template <bool complete, class TreeBuilder> TreeProperty Parser::parseProperty(TreeBuilder& context)
     1190template <typename LexerType>
     1191template <bool complete, class TreeBuilder> TreeProperty Parser<LexerType>::parseProperty(TreeBuilder& context)
    11571192{
    11581193    bool wasIdent = false;
     
    12061241}
    12071242
    1208 template <class TreeBuilder> TreeExpression Parser::parseObjectLiteral(TreeBuilder& context)
     1243template <typename LexerType>
     1244template <class TreeBuilder> TreeExpression Parser<LexerType>::parseObjectLiteral(TreeBuilder& context)
    12091245{
    12101246    int startOffset = m_token.m_data.intValue;
     
    12451281}
    12461282
    1247 template <class TreeBuilder> TreeExpression Parser::parseStrictObjectLiteral(TreeBuilder& context)
     1283template <typename LexerType>
     1284template <class TreeBuilder> TreeExpression Parser<LexerType>::parseStrictObjectLiteral(TreeBuilder& context)
    12481285{
    12491286    consumeOrFail(OPENBRACE);
     
    12891326}
    12901327
    1291 template <class TreeBuilder> TreeExpression Parser::parseArrayLiteral(TreeBuilder& context)
     1328template <typename LexerType>
     1329template <class TreeBuilder> TreeExpression Parser<LexerType>::parseArrayLiteral(TreeBuilder& context)
    12921330{
    12931331    consumeOrFailWithFlags(OPENBRACKET, TreeBuilder::DontBuildStrings);
     
    13311369}
    13321370
    1333 template <class TreeBuilder> TreeExpression Parser::parsePrimaryExpression(TreeBuilder& context)
     1371template <typename LexerType>
     1372template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePrimaryExpression(TreeBuilder& context)
    13341373{
    13351374    failIfStackOverflow();
     
    14091448}
    14101449
    1411 template <class TreeBuilder> TreeArguments Parser::parseArguments(TreeBuilder& context)
     1450template <typename LexerType>
     1451template <class TreeBuilder> TreeArguments Parser<LexerType>::parseArguments(TreeBuilder& context)
    14121452{
    14131453    consumeOrFailWithFlags(OPENPAREN, TreeBuilder::DontBuildStrings);
     
    14311471}
    14321472
    1433 template <class TreeBuilder> TreeExpression Parser::parseMemberExpression(TreeBuilder& context)
     1473template <typename LexerType>
     1474template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpression(TreeBuilder& context)
    14341475{
    14351476    TreeExpression base = 0;
     
    15111552}
    15121553
    1513 template <class TreeBuilder> TreeExpression Parser::parseUnaryExpression(TreeBuilder& context)
     1554template <typename LexerType>
     1555template <class TreeBuilder> TreeExpression Parser<LexerType>::parseUnaryExpression(TreeBuilder& context)
    15141556{
    15151557    typename TreeBuilder::UnaryExprContext unaryExprContext(context);
     
    16241666}
    16251667
     1668// Instantiate the two flavors of Parser we need instead of putting most of this file in Parser.h
     1669template class Parser< Lexer<LChar> >;
     1670template class Parser< Lexer<UChar> >;
     1671
    16261672} // namespace JSC
Note: See TracChangeset for help on using the changeset viewer.