Ignore:
Timestamp:
May 13, 2009, 2:53:59 PM (16 years ago)
Author:
Darin Adler
Message:

JavaScriptCore:

2009-05-13 Darin Adler <Darin Adler>

Revert the parser arena change. It was a slowdown, not a speedup.
Better luck next time (I'll break it up into pieces).

WebCore:

2009-05-13 Darin Adler <Darin Adler>

Revert the parser arena change. It was a slowdown, not a speedup.
Better luck next time (I'll break it up into pieces).

WebKit/mac:

2009-05-13 Darin Adler <Darin Adler>

Revert the parser arena change. It was a slowdown, not a speedup.
Better luck next time (I'll break it up into pieces).

File:
1 edited

Legend:

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

    r43642 r43661  
    5050namespace JSC {
    5151
    52 /*
    53     Details of the emitBytecode function.
    54 
    55     Return value: The register holding the production's value.
    56              dst: An optional parameter specifying the most efficient destination at
    57                   which to store the production's value. The callee must honor dst.
    58 
    59     The dst argument provides for a crude form of copy propagation. For example,
    60 
    61         x = 1
    62 
    63     becomes
    64    
    65         load r[x], 1
    66    
    67     instead of
    68 
    69         load r0, 1
    70         mov r[x], r0
    71    
    72     because the assignment node, "x =", passes r[x] as dst to the number node, "1".
    73 */
     52static void substitute(UString& string, const UString& substring) JSC_FAST_CALL;
    7453
    7554// ------------------------------ ThrowableExpressionData --------------------------------
     
    8564}
    8665
    87 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* message)
     66RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType e, const char* msg)
    8867{
    8968    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    90     RegisterID* exception = generator.emitNewError(generator.newTemporary(), type, jsString(generator.globalData(), message));
     69    RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), msg));
    9170    generator.emitThrow(exception);
    9271    return exception;
    9372}
    9473
    95 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* messageTemplate, const UString& label)
    96 {
    97     UString message = messageTemplate;
    98     substitute(message, label);
     74RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType e, const char* msg, const Identifier& label)
     75{
     76    UString message = msg;
     77    substitute(message, label.ustring());
    9978    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    100     RegisterID* exception = generator.emitNewError(generator.newTemporary(), type, jsString(generator.globalData(), message));
     79    RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), message));
    10180    generator.emitThrow(exception);
    10281    return exception;
    103 }
    104 
    105 inline RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* messageTemplate, const Identifier& label)
    106 {
    107     return emitThrowError(generator, type, messageTemplate, label.ustring());
    10882}
    10983
     
    12599}
    126100
    127 inline StatementNode* SourceElements::singleStatement() const
    128 {
    129     size_t size = m_statements.size();
    130     return size == 1 ? m_statements[0] : 0;
    131 }
    132 
    133 inline StatementNode* SourceElements::lastStatement() const
    134 {
    135     size_t size = m_statements.size();
    136     return size ? m_statements[size - 1] : 0;
    137 }
    138 
    139101// ------------------------------ NullNode -------------------------------------
    140102
     
    177139RegisterID* RegExpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    178140{
    179     RefPtr<RegExp> regExp = RegExp::create(generator.globalData(), m_pattern.ustring(), m_flags.ustring());
     141    RefPtr<RegExp> regExp = RegExp::create(generator.globalData(), m_pattern, m_flags);
    180142    if (!regExp->isValid())
    181         return emitThrowError(generator, SyntaxError, "Invalid regular expression: %s", regExp->errorMessage());
     143        return emitThrowError(generator, SyntaxError, ("Invalid regular expression: " + UString(regExp->errorMessage())).UTF8String().c_str());
    182144    if (dst == generator.ignoredResult())
    183145        return 0;
     
    631593RegisterID* PostfixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    632594{
    633     return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus
    634         ? "Postfix ++ operator applied to value that is not a reference."
    635         : "Postfix -- operator applied to value that is not a reference.");
     595    return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus ? "Postfix ++ operator applied to value that is not a reference." : "Postfix -- operator applied to value that is not a reference.");
    636596}
    637597
     
    795755RegisterID* PrefixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    796756{
    797     return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus
    798         ? "Prefix ++ operator applied to value that is not a reference."
    799         : "Prefix -- operator applied to value that is not a reference.");
     757    return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus ? "Prefix ++ operator applied to value that is not a reference." : "Prefix -- operator applied to value that is not a reference.");
    800758}
    801759
     
    12671225}
    12681226
    1269 // ------------------------------ SourceElements -------------------------------
    1270 
    1271 inline void SourceElements::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    1272 {
    1273     size_t size = m_statements.size();
     1227// ------------------------------ Helper functions for handling Vectors of StatementNode -------------------------------
     1228
     1229static inline void statementListEmitCode(const StatementVector& statements, BytecodeGenerator& generator, RegisterID* dst)
     1230{
     1231    size_t size = statements.size();
    12741232    for (size_t i = 0; i < size; ++i)
    1275         generator.emitNode(dst, m_statements[i]);
     1233        generator.emitNode(dst, statements[i]);
    12761234}
    12771235
    12781236// ------------------------------ BlockNode ------------------------------------
    12791237
    1280 inline StatementNode* BlockNode::lastStatement() const
    1281 {
    1282     return m_statements ? m_statements->lastStatement() : 0;
    1283 }
    1284 
    12851238RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    12861239{
    1287     if (m_statements)
    1288         m_statements->emitBytecode(generator, dst);
     1240    statementListEmitCode(m_children, generator, dst);
    12891241    return 0;
    12901242}
     
    15891541    generator.emitPopScope();
    15901542    return result;
    1591 }
    1592 
    1593 // ------------------------------ CaseClauseNode --------------------------------
    1594 
    1595 inline void CaseClauseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    1596 {
    1597     if (m_statements)
    1598         m_statements->emitBytecode(generator, dst);
    15991543}
    16001544
     
    17201664    for (ClauseListNode* list = m_list1; list; list = list->getNext()) {
    17211665        generator.emitLabel(labelVector[i++].get());
    1722         list->getClause()->emitBytecode(generator, dst);
     1666        statementListEmitCode(list->getClause()->children(), generator, dst);
    17231667    }
    17241668
    17251669    if (m_defaultClause) {
    17261670        generator.emitLabel(defaultLabel.get());
    1727         m_defaultClause->emitBytecode(generator, dst);
     1671        statementListEmitCode(m_defaultClause->children(), generator, dst);
    17281672    }
    17291673
    17301674    for (ClauseListNode* list = m_list2; list; list = list->getNext()) {
    17311675        generator.emitLabel(labelVector[i++].get());
    1732         list->getClause()->emitBytecode(generator, dst);
     1676        statementListEmitCode(list->getClause()->children(), generator, dst);
    17331677    }
    17341678    if (!m_defaultClause)
     
    18581802// -----------------------------ScopeNodeData ---------------------------
    18591803
    1860 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, VarStack* varStack, FunctionStack* funcStack, int numConstants)
     1804ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, int numConstants)
    18611805    : m_numConstants(numConstants)
    1862     , m_statements(statements)
    18631806{
    18641807    m_arena.swap(arena);
     
    18671810    if (funcStack)
    18681811        m_functionStack.swap(*funcStack);
     1812    if (children)
     1813        children->releaseContentsIntoVector(m_children);
    18691814}
    18701815
     
    19061851}
    19071852
    1908 inline void ScopeNode::emitStatementsBytecode(BytecodeGenerator& generator, RegisterID* dst)
    1909 {
    1910     if (m_data->m_statements)
    1911         m_data->m_statements->emitBytecode(generator, dst);
    1912 }
    1913 
    1914 inline StatementNode* ScopeNode::singleStatement() const
    1915 {
    1916     return m_data->m_statements ? m_data->m_statements->singleStatement() : 0;
    1917 }
    1918 
    19191853// ------------------------------ ProgramNode -----------------------------
    19201854
     
    19411875    RefPtr<RegisterID> dstRegister = generator.newTemporary();
    19421876    generator.emitLoad(dstRegister.get(), jsUndefined());
    1943     emitStatementsBytecode(generator, dstRegister.get());
     1877    statementListEmitCode(children(), generator, dstRegister.get());
    19441878
    19451879    generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine());
     
    19851919    RefPtr<RegisterID> dstRegister = generator.newTemporary();
    19861920    generator.emitLoad(dstRegister.get(), jsUndefined());
    1987     emitStatementsBytecode(generator, dstRegister.get());
     1921    statementListEmitCode(children(), generator, dstRegister.get());
    19881922
    19891923    generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine());
     
    20031937
    20041938    // Eval code needs to hang on to its declaration stacks to keep declaration info alive until Interpreter::execute time,
    2005     // so the ScopeNodeData cannot be destroyed at this point. Maybe we can destroy part of it in the future?
     1939    // so the entire ScopeNodeData cannot be destoyed.
     1940    children().clear();
    20061941}
    20071942
     
    21572092{
    21582093    generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine());
    2159     emitStatementsBytecode(generator, generator.ignoredResult());
    2160     StatementNode* singleStatement = this->singleStatement();
    2161     if (singleStatement && singleStatement->isBlock()) {
    2162         StatementNode* lastStatementInBlock = static_cast<BlockNode*>(singleStatement)->lastStatement();
    2163         if (lastStatementInBlock && lastStatementInBlock->isReturnNode())
     2094    statementListEmitCode(children(), generator, generator.ignoredResult());
     2095    if (children().size() && children().last()->isBlock()) {
     2096        BlockNode* blockNode = static_cast<BlockNode*>(children().last());
     2097        if (blockNode->children().size() && blockNode->children().last()->isReturnNode())
    21642098            return 0;
    21652099    }
Note: See TracChangeset for help on using the changeset viewer.