Ignore:
Timestamp:
Jan 9, 2018, 10:49:25 AM (7 years ago)
Author:
[email protected]
Message:

ASSERTION FAILED: pair.second->m_type & PropertyNode::Getter
https://bugs.webkit.org/show_bug.cgi?id=181388
<rdar://problem/36349351>

Reviewed by Saam Barati.

JSTests:

  • stress/regress-181388.js: Added.

Source/JavaScriptCore:

When there are duplicate setters or getters, we may end up overwriting a getter
with a setter, or vice versa. This patch adds tracking for getters/setters that
have been overwritten with duplicates and ignore them.

  • bytecompiler/NodesCodegen.cpp:

(JSC::PropertyListNode::emitBytecode):

  • parser/NodeConstructors.h:

(JSC::PropertyNode::PropertyNode):

  • parser/Nodes.h:

(JSC::PropertyNode::isOverriddenByDuplicate const):
(JSC::PropertyNode::setIsOverriddenByDuplicate):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r226310 r226650  
    22*  Copyright (C) 1999-2002 Harri Porten ([email protected])
    33*  Copyright (C) 2001 Peter Kelly ([email protected])
    4 *  Copyright (C) 2003-2017 Apple Inc. All rights reserved.
     4*  Copyright (C) 2003-2018 Apple Inc. All rights reserved.
    55*  Copyright (C) 2007 Cameron Zwarich ([email protected])
    66*  Copyright (C) 2007 Maks Orlovich
     
    540540            GetterSetterPair pair(node, static_cast<PropertyNode*>(nullptr));
    541541            GetterSetterMap::AddResult result = map.add(node->name()->impl(), pair);
     542            auto& resultPair = result.iterator->value;
    542543            if (!result.isNewEntry) {
    543                 if (result.iterator->value.first->m_type == node->m_type)
    544                     result.iterator->value.first = node;
    545                 else
    546                     result.iterator->value.second = node;
     544                if (resultPair.first->m_type == node->m_type) {
     545                    resultPair.first->setIsOverriddenByDuplicate();
     546                    resultPair.first = node;
     547                } else {
     548                    if (resultPair.second)
     549                        resultPair.second->setIsOverriddenByDuplicate();
     550                    resultPair.second = node;
     551                }
    547552            }
    548553        }
     
    596601
    597602            // Was this already generated as a part of its partner?
    598             if (pair.second == node)
     603            if (pair.second == node || node->isOverriddenByDuplicate())
    599604                continue;
    600605
Note: See TracChangeset for help on using the changeset viewer.