Ignore:
Timestamp:
Jan 25, 2008, 11:54:50 PM (17 years ago)
Author:
[email protected]
Message:

Fix for bug 17012: REGRESSION: JSC can't round trip an object literal

Reviewed by Maciej.

Add logic to ensure that object literals and function expressions get
parenthesis when necessary.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes2string.cpp

    r28973 r29802  
    4242class SourceStream {
    4343public:
    44     SourceStream() : m_numberNeedsParens(false), m_precedence(PrecExpression) { }
     44    SourceStream() : m_numberNeedsParens(false), m_atStartOfStatement(true), m_precedence(PrecExpression) { }
    4545    UString toString() const { return m_string; }
    4646    SourceStream& operator<<(const Identifier&);
     
    6161    UString m_spacesForIndentation;
    6262    bool m_numberNeedsParens;
     63    bool m_atStartOfStatement;
    6364    Precedence m_precedence;
    6465};
     
    151152{
    152153    m_numberNeedsParens = false;
     154    m_atStartOfStatement = false;
    153155    UChar ch(c);
    154156    m_string.append(ch);
     
    159161{
    160162    m_numberNeedsParens = false;
     163    m_atStartOfStatement = false;
    161164    m_string += s;
    162165    return *this;
     
    167170    bool needParens = m_numberNeedsParens;
    168171    m_numberNeedsParens = false;
     172    m_atStartOfStatement = false;
    169173
    170174    if (needParens)
     
    180184{
    181185    m_numberNeedsParens = false;
     186    m_atStartOfStatement = false;
    182187    m_string += s;
    183188    return *this;
     
    187192{
    188193    m_numberNeedsParens = false;
     194    m_atStartOfStatement = false;
    189195    m_string += s.ustring();
    190196    return *this;
     
    193199SourceStream& SourceStream::operator<<(const Node* n)
    194200{
    195     bool needParens = m_precedence != PrecExpression && n->precedence() > m_precedence;
     201    bool needParens = (m_precedence != PrecExpression && n->precedence() > m_precedence) || (m_atStartOfStatement && n->needsParensIfLeftmost());
    196202    m_precedence = PrecExpression;
    197203    if (n) {
     
    208214{
    209215    m_numberNeedsParens = false;
     216    m_atStartOfStatement = true;
    210217    m_string.append('\n');
    211218    m_string.append(m_spacesForIndentation);
     
    216223{
    217224    m_numberNeedsParens = false;
     225    m_atStartOfStatement = false;
    218226    m_spacesForIndentation += "  ";
    219227    return *this;
     
    223231{
    224232    m_numberNeedsParens = false;
     233    m_atStartOfStatement = false;
    225234    m_spacesForIndentation = m_spacesForIndentation.substr(0, m_spacesForIndentation.size() - 2);
    226235    return *this;
Note: See TracChangeset for help on using the changeset viewer.