Title: [226851] branches/safari-605-branch

Diff

Modified: branches/safari-605-branch/JSTests/ChangeLog (226850 => 226851)


--- branches/safari-605-branch/JSTests/ChangeLog	2018-01-12 04:52:23 UTC (rev 226850)
+++ branches/safari-605-branch/JSTests/ChangeLog	2018-01-12 04:52:26 UTC (rev 226851)
@@ -1,3 +1,17 @@
+2018-01-11  Jason Marcell  <jmarc...@apple.com>
+
+        Cherry-pick r226650. rdar://problem/36429150
+
+    2018-01-09  Mark Lam  <mark....@apple.com>
+
+            ASSERTION FAILED: pair.second->m_type & PropertyNode::Getter
+            https://bugs.webkit.org/show_bug.cgi?id=181388
+            <rdar://problem/36349351>
+
+            Reviewed by Saam Barati.
+
+            * stress/regress-181388.js: Added.
+
 2018-01-09  Jason Marcell  <jmarc...@apple.com>
 
         Cherry-pick r226615. rdar://problem/36392328

Added: branches/safari-605-branch/JSTests/stress/regress-181388.js (0 => 226851)


--- branches/safari-605-branch/JSTests/stress/regress-181388.js	                        (rev 0)
+++ branches/safari-605-branch/JSTests/stress/regress-181388.js	2018-01-12 04:52:26 UTC (rev 226851)
@@ -0,0 +1,71 @@
+function assert(x) {
+    if (!x)
+        throw "FAIL";
+}
+
+(function() {
+    var trace = [];
+
+    var foo = {
+        value: 5,
+        get bar() {
+            trace.push("get");
+            return this.value;
+        },
+        set bar(x) {
+            throw "Should not be reached";
+        },
+        set bar(x) {
+            trace.push("set2");
+            this.value = x + 10000;
+            return this.value;
+        }
+    }
+
+    assert(foo.value == 5);
+    assert(trace == "");
+    assert(foo.bar == 5);
+    assert(trace == "get");
+
+    foo.bar = 20;
+    assert(trace == "get,set2");
+
+    assert(foo.value == 10020);
+    assert(trace == "get,set2");
+    assert(foo.bar == 10020);
+    assert(trace == "get,set2,get");
+})();
+
+(function() {
+    var trace = [];
+
+    var foo = {
+        value: 5,
+        set bar(x) {
+            trace.push("set");
+            this.value = x;
+            return this.value;
+        },
+        get bar() {
+            throw "Should not be reached";
+        },
+        get bar() {
+            trace.push("get2");
+            this.value += 10000;
+            return this.value;
+        },
+    }
+
+    assert(foo.value == 5);
+    assert(trace == "");
+    assert(foo.bar == 10005);
+    assert(trace == "get2");
+
+    foo.bar = 20;
+    assert(trace == "get2,set");
+
+    assert(foo.value == 20);
+    assert(trace == "get2,set");
+    assert(foo.bar == 10020);
+    assert(trace == "get2,set,get2");
+})();

Modified: branches/safari-605-branch/Source/_javascript_Core/ChangeLog (226850 => 226851)


--- branches/safari-605-branch/Source/_javascript_Core/ChangeLog	2018-01-12 04:52:23 UTC (rev 226850)
+++ branches/safari-605-branch/Source/_javascript_Core/ChangeLog	2018-01-12 04:52:26 UTC (rev 226851)
@@ -1,3 +1,27 @@
+2018-01-11  Jason Marcell  <jmarc...@apple.com>
+
+        Cherry-pick r226650. rdar://problem/36429150
+
+    2018-01-09  Mark Lam  <mark....@apple.com>
+
+            ASSERTION FAILED: pair.second->m_type & PropertyNode::Getter
+            https://bugs.webkit.org/show_bug.cgi?id=181388
+            <rdar://problem/36349351>
+
+            Reviewed by Saam Barati.
+
+            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):
+
 2018-01-09  Jason Marcell  <jmarc...@apple.com>
 
         Cherry-pick r226672. rdar://problem/36397330

Modified: branches/safari-605-branch/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (226850 => 226851)


--- branches/safari-605-branch/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2018-01-12 04:52:23 UTC (rev 226850)
+++ branches/safari-605-branch/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2018-01-12 04:52:26 UTC (rev 226851)
@@ -1,7 +1,7 @@
 /*
 *  Copyright (C) 1999-2002 Harri Porten (por...@kde.org)
 *  Copyright (C) 2001 Peter Kelly (p...@post.com)
-*  Copyright (C) 2003-2017 Apple Inc. All rights reserved.
+*  Copyright (C) 2003-2018 Apple Inc. All rights reserved.
 *  Copyright (C) 2007 Cameron Zwarich (cwzwar...@uwaterloo.ca)
 *  Copyright (C) 2007 Maks Orlovich
 *  Copyright (C) 2007 Eric Seidel <e...@webkit.org>
@@ -539,11 +539,16 @@
             // Duplicates are possible.
             GetterSetterPair pair(node, static_cast<PropertyNode*>(nullptr));
             GetterSetterMap::AddResult result = map.add(node->name()->impl(), pair);
+            auto& resultPair = result.iterator->value;
             if (!result.isNewEntry) {
-                if (result.iterator->value.first->m_type == node->m_type)
-                    result.iterator->value.first = node;
-                else
-                    result.iterator->value.second = node;
+                if (resultPair.first->m_type == node->m_type) {
+                    resultPair.first->setIsOverriddenByDuplicate();
+                    resultPair.first = node;
+                } else {
+                    if (resultPair.second)
+                        resultPair.second->setIsOverriddenByDuplicate();
+                    resultPair.second = node;
+                }
             }
         }
 
@@ -595,7 +600,7 @@
             GetterSetterPair& pair = it->value;
 
             // Was this already generated as a part of its partner?
-            if (pair.second == node)
+            if (pair.second == node || node->isOverriddenByDuplicate())
                 continue;
 
             // Generate the paired node now.

Modified: branches/safari-605-branch/Source/_javascript_Core/parser/NodeConstructors.h (226850 => 226851)


--- branches/safari-605-branch/Source/_javascript_Core/parser/NodeConstructors.h	2018-01-12 04:52:23 UTC (rev 226850)
+++ branches/safari-605-branch/Source/_javascript_Core/parser/NodeConstructors.h	2018-01-12 04:52:26 UTC (rev 226851)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2009, 2013, 2015-2016 Apple Inc. All rights reserved.
+ *  Copyright (C) 2009-2018 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Library General Public
@@ -248,6 +248,7 @@
         , m_needsSuperBinding(superBinding == SuperBinding::Needed)
         , m_putType(putType)
         , m_isClassProperty(isClassProperty)
+        , m_isOverriddenByDuplicate(false)
     {
     }
     
@@ -258,6 +259,7 @@
         , m_needsSuperBinding(superBinding == SuperBinding::Needed)
         , m_putType(putType)
         , m_isClassProperty(isClassProperty)
+        , m_isOverriddenByDuplicate(false)
     {
     }
 
@@ -269,6 +271,7 @@
         , m_needsSuperBinding(superBinding == SuperBinding::Needed)
         , m_putType(putType)
         , m_isClassProperty(isClassProperty)
+        , m_isOverriddenByDuplicate(false)
     {
     }
 

Modified: branches/safari-605-branch/Source/_javascript_Core/parser/Nodes.h (226850 => 226851)


--- branches/safari-605-branch/Source/_javascript_Core/parser/Nodes.h	2018-01-12 04:52:23 UTC (rev 226850)
+++ branches/safari-605-branch/Source/_javascript_Core/parser/Nodes.h	2018-01-12 04:52:26 UTC (rev 226851)
@@ -1,7 +1,7 @@
 /*
  *  Copyright (C) 1999-2000 Harri Porten (por...@kde.org)
  *  Copyright (C) 2001 Peter Kelly (p...@post.com)
- *  Copyright (C) 2003-2009, 2013, 2015-2016 Apple Inc. All rights reserved.
+ *  Copyright (C) 2003-2018 Apple Inc. All rights reserved.
  *  Copyright (C) 2007 Cameron Zwarich (cwzwar...@uwaterloo.ca)
  *  Copyright (C) 2007 Maks Orlovich
  *  Copyright (C) 2007 Eric Seidel <e...@webkit.org>
@@ -697,6 +697,8 @@
         Type type() const { return static_cast<Type>(m_type); }
         bool needsSuperBinding() const { return m_needsSuperBinding; }
         bool isClassProperty() const { return m_isClassProperty; }
+        bool isOverriddenByDuplicate() const { return m_isOverriddenByDuplicate; }
+        void setIsOverriddenByDuplicate() { m_isOverriddenByDuplicate = true; }
         PutType putType() const { return static_cast<PutType>(m_putType); }
 
     private:
@@ -708,6 +710,7 @@
         unsigned m_needsSuperBinding : 1;
         unsigned m_putType : 1;
         unsigned m_isClassProperty: 1;
+        unsigned m_isOverriddenByDuplicate: 1;
     };
 
     class PropertyListNode : public ExpressionNode {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to