Changeset 29802 in webkit for trunk/JavaScriptCore/kjs


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.

Location:
trunk/JavaScriptCore/kjs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.h

    r29059 r29802  
    134134    virtual void streamTo(SourceStream&) const KJS_FAST_CALL = 0;
    135135    virtual Precedence precedence() const = 0;
    136    
     136    virtual bool needsParensIfLeftmost() const { return false; }
     137
    137138    // Used for iterative, depth-first traversal of the node tree. Does not cross function call boundaries.
    138139    virtual void optimizeVariableAccess(SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL { }
     
    436437    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    437438    virtual Precedence precedence() const { return PrecPrimary; }
     439    virtual bool needsParensIfLeftmost() const { return true; }
    438440  private:
    439441    RefPtr<PropertyListNode> list;
     
    20212023    virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    20222024    virtual Precedence precedence() const { return PrecMember; }
     2025    virtual bool needsParensIfLeftmost() const { return true; }
    20232026  private:
    20242027    void addParams() KJS_FAST_CALL;
  • 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.