Ignore:
Timestamp:
Dec 4, 2014, 3:47:49 PM (10 years ago)
Author:
[email protected]
Message:

Split out FunctionNode from FunctionBodyNode
https://bugs.webkit.org/show_bug.cgi?id=139273

Reviewed by Andreas Kling.

This is step toward a parser speedup.

We used to use FunctionBodyNode for two different purposes:

(1) "I am the root function you are currently parsing";

(2) "I am a lazy record of a nested function, which you will parse later".

This made for awkward lifetime semantics and interfaces.

Now, case (1) is handled by FunctionBodyNode, and case (2) is handled by
a new node named FunctionNode.

Since case (1) no longer needs to handle being the root of the parse
tree, FunctionBodyNode can be a normal arena-allocated node.

  • bytecode/UnlinkedCodeBlock.cpp:

(JSC::generateFunctionCodeBlock): Use FunctionNode instead of
FunctionBodyNode, since we are producing the root of the function parse
tree.

(JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable): Removed
some unused data, and default-initialized other data, which isn't filled
in meaningfully until recordParse() is called. (The previous values were
incorrect / meaningless, since the FunctionBodyNode didn't have
meaningful values in this case.)

  • bytecode/UnlinkedCodeBlock.h: Ditto.

(JSC::UnlinkedFunctionExecutable::forceUsesArguments): Deleted.

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator): Use FunctionNode instead of
FunctionBodyNode, since we are generating code starting at the root of
the parse tree.

(JSC::BytecodeGenerator::resolveCallee):
(JSC::BytecodeGenerator::addCallee):

  • bytecompiler/BytecodeGenerator.h: Ditto.
  • bytecompiler/NodesCodegen.cpp:

(JSC::FunctionBodyNode::emitBytecode):
(JSC::FunctionNode::emitBytecode): Moved the emitBytecode implementation
to FunctionNode, since we never generate code for FunctionBodyNode,
since it's just a placeholder in the AST.

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createFunctionBody):
(JSC::ASTBuilder::setUsesArguments): Deleted. Updated for interface
changes.

  • parser/Nodes.cpp:

(JSC::FunctionBodyNode::FunctionBodyNode):
(JSC::FunctionBodyNode::finishParsing):
(JSC::FunctionBodyNode::setEndPosition):
(JSC::FunctionNode::FunctionNode):
(JSC::FunctionNode::create):
(JSC::FunctionNode::finishParsing):
(JSC::FunctionBodyNode::create): Deleted.

  • parser/Nodes.h:

(JSC::FunctionBodyNode::parameters):
(JSC::FunctionBodyNode::source):
(JSC::FunctionBodyNode::startStartOffset):
(JSC::FunctionBodyNode::isInStrictContext):
(JSC::FunctionNode::parameters):
(JSC::FunctionNode::ident):
(JSC::FunctionNode::functionMode):
(JSC::FunctionNode::startColumn):
(JSC::FunctionNode::endColumn):
(JSC::ScopeNode::setSource): Deleted.
(JSC::FunctionBodyNode::parameterCount): Deleted. Split out the differences
between FunctionNode and FunctionBodyNode.

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createClauseList):
(JSC::SyntaxChecker::setUsesArguments): Deleted. Removed setUsesArguments
since it wasn't used.

  • runtime/Executable.cpp:

(JSC::ProgramExecutable::checkSyntax): Removed a branch that was always
false.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r176756 r176822  
    14671467
    14681468    protected:
    1469         void setSource(const SourceCode& source) { m_source = source; }
    14701469        ParserArena m_arena;
    14711470
     
    14861485    class ProgramNode : public ScopeNode {
    14871486    public:
    1488         static const bool isFunctionNode = false;
    14891487        static PassRefPtr<ProgramNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
    14901488
     
    15071505    class EvalNode : public ScopeNode {
    15081506    public:
    1509         static const bool isFunctionNode = false;
    15101507        static PassRefPtr<EvalNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
    15111508
     
    15421539    };
    15431540
    1544     class FunctionBodyNode : public ScopeNode {
    1545     public:
    1546         static const bool isFunctionNode = true;
    1547         static FunctionBodyNode* create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, bool isStrictMode);
    1548         static PassRefPtr<FunctionBodyNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
     1541    class FunctionBodyNode : public StatementNode, public ParserArenaDeletable {
     1542    public:
     1543        using ParserArenaDeletable::operator new;
     1544
     1545        FunctionBodyNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, bool isInStrictContext);
    15491546
    15501547        FunctionParameters* parameters() const { return m_parameters.get(); }
    1551         size_t parameterCount() const { return m_parameters->size(); }
    15521548
    15531549        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
    15541550
    15551551        void finishParsing(const SourceCode&, ParameterNode*, const Identifier&, FunctionMode);
    1556         void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&, FunctionMode);
    15571552       
    15581553        void overrideName(const Identifier& ident) { m_ident = ident; }
     
    15701565        void setEndPosition(JSTextPosition);
    15711566
    1572         static const bool scopeIsFunction = true;
    1573 
    1574     private:
    1575         FunctionBodyNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, bool inStrictContext);
    1576         FunctionBodyNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
    1577 
     1567        const SourceCode& source() const { return m_source; }
     1568
     1569        int startStartOffset() const { return m_startStartOffset; }
     1570        bool isInStrictContext() const { return m_isInStrictContext; }
     1571
     1572    protected:
    15781573        Identifier m_ident;
    15791574        Identifier m_inferredName;
     
    15811576        RefPtr<FunctionParameters> m_parameters;
    15821577        int m_functionNameStart;
     1578        unsigned m_startColumn;
     1579        unsigned m_endColumn;
     1580        SourceCode m_source;
     1581        int m_startStartOffset;
     1582        bool m_isInStrictContext;
     1583    };
     1584
     1585    class FunctionNode : public ScopeNode {
     1586    public:
     1587        static PassRefPtr<FunctionNode> create(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
     1588
     1589        FunctionParameters* parameters() const { return m_parameters.get(); }
     1590
     1591        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1592
     1593        void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&, FunctionMode);
     1594       
     1595        const Identifier& ident() { return m_ident; }
     1596
     1597        FunctionMode functionMode() { return m_functionMode; }
     1598
     1599        unsigned startColumn() const { return m_startColumn; }
     1600        unsigned endColumn() const { return m_endColumn; }
     1601
     1602        static const bool scopeIsFunction = true;
     1603
     1604    private:
     1605        FunctionNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, unsigned startColumn, unsigned endColumn, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
     1606
     1607        Identifier m_ident;
     1608        FunctionMode m_functionMode;
     1609        RefPtr<FunctionParameters> m_parameters;
    15831610        unsigned m_startColumn;
    15841611        unsigned m_endColumn;
Note: See TracChangeset for help on using the changeset viewer.