Ignore:
Timestamp:
Mar 7, 2012, 2:18:43 AM (13 years ago)
Author:
[email protected]
Message:

Parser: Inline ScopeNodeData into ScopeNode
https://bugs.webkit.org/show_bug.cgi?id=79776

Reviewed by Geoffrey Garen.

It used to be that some ScopeNode members were kept in a separate
structure because sometimes they wouldn't be needed, and
allocating a ParserArena was expensive. This patch makes
ParserArena lazily allocate its IdentifierArena, allowing the
members to be included directly, which is simpler and easier to
reason about.

  • parser/ParserArena.cpp:

(JSC::ParserArena::ParserArena):
(JSC::ParserArena::reset):
(JSC::ParserArena::isEmpty):

  • parser/ParserArena.h:

(JSC::ParserArena::identifierArena): Lazily allocate the
IdentifierArena.

  • parser/Nodes.cpp:

(JSC::ScopeNode::ScopeNode):
(JSC::ScopeNode::singleStatement):
(JSC::ProgramNode::create):
(JSC::EvalNode::create):
(JSC::FunctionBodyNode::create):

  • parser/Nodes.h:

(JSC::ScopeNode::destroyData):
(JSC::ScopeNode::needsActivationForMoreThanVariables):
(JSC::ScopeNode::needsActivation):
(JSC::ScopeNode::hasCapturedVariables):
(JSC::ScopeNode::capturedVariableCount):
(JSC::ScopeNode::captures):
(JSC::ScopeNode::varStack):
(JSC::ScopeNode::functionStack):
(JSC::ScopeNode::neededConstants):
(ScopeNode):

  • bytecompiler/NodesCodegen.cpp:

(JSC::ScopeNode::emitStatementsBytecode): Inline ScopeNodeData
into ScopeNode. Adapt accessors.

File:
1 edited

Legend:

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

    r98887 r110039  
    7474}
    7575
    76 // -----------------------------ScopeNodeData ---------------------------
     76// ------------------------------ ScopeNode -----------------------------
    7777
    78 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, int numConstants)
    79     : m_numConstants(numConstants)
    80     , m_statements(statements)
     78ScopeNode::ScopeNode(JSGlobalData* globalData, int lineNumber, bool inStrictContext)
     79    : StatementNode(lineNumber)
     80    , ParserArenaRefCounted(globalData)
     81    , m_features(inStrictContext ? StrictModeFeature : NoFeatures)
     82    , m_numConstants(0)
     83    , m_statements(0)
    8184{
    82     m_arena.swap(arena);
     85}
     86
     87ScopeNode::ScopeNode(JSGlobalData* globalData, int lineNumber, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, CodeFeatures features, int numConstants)
     88    : StatementNode(lineNumber)
     89    , ParserArenaRefCounted(globalData)
     90    , m_features(features)
     91    , m_source(source)
     92    , m_numConstants(numConstants)
     93    , m_statements(children)
     94{
     95    m_arena.swap(*globalData->parserArena);
    8396    if (varStack)
    8497        m_varStack.swap(*varStack);
     
    88101}
    89102
    90 // ------------------------------ ScopeNode -----------------------------
    91 
    92 ScopeNode::ScopeNode(JSGlobalData* globalData, int lineNumber, bool inStrictContext)
    93     : StatementNode(lineNumber)
    94     , ParserArenaRefCounted(globalData)
    95     , m_features(inStrictContext ? StrictModeFeature : NoFeatures)
    96 {
    97 }
    98 
    99 ScopeNode::ScopeNode(JSGlobalData* globalData, int lineNumber, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, CodeFeatures features, int numConstants)
    100     : StatementNode(lineNumber)
    101     , ParserArenaRefCounted(globalData)
    102     , m_data(adoptPtr(new ScopeNodeData(*globalData->parserArena, children, varStack, funcStack, capturedVariables, numConstants)))
    103     , m_features(features)
    104     , m_source(source)
    105 {
    106 }
    107 
    108103StatementNode* ScopeNode::singleStatement() const
    109104{
    110     return m_data->m_statements ? m_data->m_statements->singleStatement() : 0;
     105    return m_statements ? m_statements->singleStatement() : 0;
    111106}
    112107
     
    122117    RefPtr<ProgramNode> node = new ProgramNode(globalData, lineNumber, children, varStack, funcStack,  capturedVariables, source, features, numConstants);
    123118
    124     ASSERT(node->data()->m_arena.last() == node);
    125     node->data()->m_arena.removeLast();
    126     ASSERT(!node->data()->m_arena.contains(node.get()));
     119    ASSERT(node->m_arena.last() == node);
     120    node->m_arena.removeLast();
     121    ASSERT(!node->m_arena.contains(node.get()));
    127122
    128123    return node.release();
     
    140135    RefPtr<EvalNode> node = new EvalNode(globalData, lineNumber, children, varStack, funcStack, capturedVariables, source, features, numConstants);
    141136
    142     ASSERT(node->data()->m_arena.last() == node);
    143     node->data()->m_arena.removeLast();
    144     ASSERT(!node->data()->m_arena.contains(node.get()));
     137    ASSERT(node->m_arena.last() == node);
     138    node->m_arena.removeLast();
     139    ASSERT(!node->m_arena.contains(node.get()));
    145140
    146141    return node.release();
     
    187182    RefPtr<FunctionBodyNode> node = new FunctionBodyNode(globalData, lineNumber, children, varStack, funcStack, capturedVariables, sourceCode, features, numConstants);
    188183
    189     ASSERT(node->data()->m_arena.last() == node);
    190     node->data()->m_arena.removeLast();
    191     ASSERT(!node->data()->m_arena.contains(node.get()));
     184    ASSERT(node->m_arena.last() == node);
     185    node->m_arena.removeLast();
     186    ASSERT(!node->m_arena.contains(node.get()));
    192187
    193188    return node.release();
Note: See TracChangeset for help on using the changeset viewer.