Title: [158051] trunk
Revision
158051
Author
[email protected]
Date
2013-10-25 14:31:36 -0700 (Fri, 25 Oct 2013)

Log Message

Fix a number of problems with destructuring of arguments
https://bugs.webkit.org/show_bug.cgi?id=123357

Reviewed by Filip Pizlo.

Source/_javascript_Core:

This renames the destructuring node's emitBytecode to bindValue
in order to remove the existing confusion over what was happening.

We then fix an incorrect fall through in the destructuring arguments
logic, and fix the then exposed bug where we placed the index rather
than value into the bound property.

* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::BytecodeGenerator):
* bytecompiler/NodesCodegen.cpp:
(JSC::ForInNode::emitBytecode):
(JSC::ForOfNode::emitBytecode):
(JSC::DeconstructingAssignmentNode::emitBytecode):
(JSC::ArrayPatternNode::bindValue):
(JSC::ArrayPatternNode::emitDirectBinding):
(JSC::ObjectPatternNode::bindValue):
(JSC::BindingNode::bindValue):
* parser/Nodes.h:

LayoutTests:

Add additional testing

* js/destructuring-assignment-expected.txt:
* js/script-tests/destructuring-assignment.js:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (158050 => 158051)


--- trunk/LayoutTests/ChangeLog	2013-10-25 20:59:15 UTC (rev 158050)
+++ trunk/LayoutTests/ChangeLog	2013-10-25 21:31:36 UTC (rev 158051)
@@ -1,3 +1,15 @@
+2013-10-25  Oliver Hunt  <[email protected]>
+
+        Fix a number of problems with destructuring of arguments
+        https://bugs.webkit.org/show_bug.cgi?id=123357
+
+        Reviewed by Filip Pizlo.
+
+        Add additional testing
+
+        * js/destructuring-assignment-expected.txt:
+        * js/script-tests/destructuring-assignment.js:
+
 2013-10-25  Hans Muller  <[email protected]>
 
         [CSS Shapes] CORS-enabled fetch for shape image values

Modified: trunk/LayoutTests/js/destructuring-assignment-expected.txt (158050 => 158051)


--- trunk/LayoutTests/js/destructuring-assignment-expected.txt	2013-10-25 20:59:15 UTC (rev 158050)
+++ trunk/LayoutTests/js/destructuring-assignment-expected.txt	2013-10-25 21:31:36 UTC (rev 158051)
@@ -63,6 +63,7 @@
 PASS a+b is '2211'
 PASS testDeconstructArgs('1', '2') is '12'
 PASS testDeconstructArgLength('1', '2') is 2
+PASS testDeconstructArgs('2') is '23'
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/js/script-tests/destructuring-assignment.js (158050 => 158051)


--- trunk/LayoutTests/js/script-tests/destructuring-assignment.js	2013-10-25 20:59:15 UTC (rev 158050)
+++ trunk/LayoutTests/js/script-tests/destructuring-assignment.js	2013-10-25 21:31:36 UTC (rev 158051)
@@ -43,6 +43,10 @@
 }
 shouldBe("testDeconstructArgs('1', '2')", "'12'");
 shouldBe("testDeconstructArgLength('1', '2')", "2");
+var text = '3';
+Object.prototype.__defineGetter__(1, function(){ var r = text; text = "fail"; return r; })
+shouldBe("testDeconstructArgs('2')", "'23'");
 
 
 
+

Modified: trunk/Source/_javascript_Core/ChangeLog (158050 => 158051)


--- trunk/Source/_javascript_Core/ChangeLog	2013-10-25 20:59:15 UTC (rev 158050)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-10-25 21:31:36 UTC (rev 158051)
@@ -1,3 +1,29 @@
+2013-10-25  Oliver Hunt  <[email protected]>
+
+        Fix a number of problems with destructuring of arguments
+        https://bugs.webkit.org/show_bug.cgi?id=123357
+
+        Reviewed by Filip Pizlo.
+
+        This renames the destructuring node's emitBytecode to bindValue
+        in order to remove the existing confusion over what was happening.
+
+        We then fix an incorrect fall through in the destructuring arguments
+        logic, and fix the then exposed bug where we placed the index rather
+        than value into the bound property.
+
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::BytecodeGenerator):
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::ForInNode::emitBytecode):
+        (JSC::ForOfNode::emitBytecode):
+        (JSC::DeconstructingAssignmentNode::emitBytecode):
+        (JSC::ArrayPatternNode::bindValue):
+        (JSC::ArrayPatternNode::emitDirectBinding):
+        (JSC::ObjectPatternNode::bindValue):
+        (JSC::BindingNode::bindValue):
+        * parser/Nodes.h:
+
 2013-10-25  Joseph Pecoraro  <[email protected]>
 
         Upstream ENABLE(REMOTE_INSPECTOR) and enable on iOS and Mac

Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp (158050 => 158051)


--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp	2013-10-25 20:59:15 UTC (rev 158050)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp	2013-10-25 21:31:36 UTC (rev 158051)
@@ -394,7 +394,7 @@
     }
     for (size_t i = 0; i < deconstructedParameters.size(); i++) {
         auto& entry = deconstructedParameters[i];
-        entry.second->emitBytecode(*this, entry.first);
+        entry.second->bindValue(*this, entry.first);
     }
 }
 

Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (158050 => 158051)


--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2013-10-25 20:59:15 UTC (rev 158050)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2013-10-25 21:31:36 UTC (rev 158051)
@@ -1781,7 +1781,7 @@
         genericBinding:
             propertyName = generator.newTemporary();
             RefPtr<RegisterID> protect(propertyName);
-            assignNode->bindings()->emitBytecode(generator, propertyName);
+            assignNode->bindings()->bindValue(generator, propertyName);
         }
         completedSimpleBinding:
         ;
@@ -1839,7 +1839,7 @@
         } else {
             ASSERT(m_lexpr->isDeconstructionNode());
             DeconstructingAssignmentNode* assignNode = static_cast<DeconstructingAssignmentNode*>(m_lexpr);
-            assignNode->bindings()->emitBytecode(generator, value);
+            assignNode->bindings()->bindValue(generator, value);
         }
         generator.emitNode(dst, m_statement);
     };
@@ -2297,7 +2297,7 @@
         return result;
     RefPtr<RegisterID> initializer = generator.tempDestination(dst);
     generator.emitNode(initializer.get(), m_initializer);
-    m_bindings->emitBytecode(generator, initializer.get());
+    m_bindings->bindValue(generator, initializer.get());
     return generator.moveToDestinationIfNeeded(dst, initializer.get());
 }
 
@@ -2305,7 +2305,7 @@
 {
 }
     
-void ArrayPatternNode::emitBytecode(BytecodeGenerator& generator, RegisterID* rhs) const
+void ArrayPatternNode::bindValue(BytecodeGenerator& generator, RegisterID* rhs) const
 {
     for (size_t i = 0; i < m_targetPatterns.size(); i++) {
         auto target = m_targetPatterns[i];
@@ -2314,7 +2314,7 @@
         RefPtr<RegisterID> temp = generator.newTemporary();
         generator.emitLoad(temp.get(), jsNumber(i));
         generator.emitGetByVal(temp.get(), rhs, temp.get());
-        target->emitBytecode(generator, temp.get());
+        target->bindValue(generator, temp.get());
     }
 }
 
@@ -2330,12 +2330,14 @@
             
             RefPtr<RegisterID> temp = generator.newTemporary();
             generator.emitLoad(temp.get(), jsNumber(i));
-            generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), temp.get());
-            target->emitBytecode(generator, temp.get());
+            generator.emitGetArgumentByVal(temp.get(), generator.uncheckedRegisterForArguments(), temp.get());
+            target->bindValue(generator, temp.get());
         }
+        return generator.emitLoad(generator.finalDestination(dst), jsUndefined());
     }
     if (!rhs->isSimpleArray())
         return 0;
+
     ElementNode* elementNodes = static_cast<ArrayNode*>(rhs)->elements();
     Vector<ExpressionNode*> elements;
     for (; elementNodes; elementNodes = elementNodes->next())
@@ -2351,10 +2353,10 @@
     
     for (size_t i = 0; i < m_targetPatterns.size(); i++) {
         if (m_targetPatterns[i])
-            m_targetPatterns[i]->emitBytecode(generator, registers[i].get());
+            m_targetPatterns[i]->bindValue(generator, registers[i].get());
     }
-    RefPtr<RegisterID> result = generator.finalDestination(dst);
-    return generator.emitLoad(result.get(), jsUndefined());
+
+    return generator.emitLoad(generator.finalDestination(dst), jsUndefined());
 }
 
 void ArrayPatternNode::toString(StringBuilder& builder) const
@@ -2398,13 +2400,13 @@
     builder.append('}');
 }
     
-void ObjectPatternNode::emitBytecode(BytecodeGenerator& generator, RegisterID* rhs) const
+void ObjectPatternNode::bindValue(BytecodeGenerator& generator, RegisterID* rhs) const
 {
     for (size_t i = 0; i < m_targetPatterns.size(); i++) {
         auto& target = m_targetPatterns[i];
         RefPtr<RegisterID> temp = generator.newTemporary();
         generator.emitGetById(temp.get(), rhs, target.propertyName);
-        target.pattern->emitBytecode(generator, temp.get());
+        target.pattern->bindValue(generator, temp.get());
     }
 }
 
@@ -2414,7 +2416,7 @@
         m_targetPatterns[i].pattern->collectBoundIdentifiers(identifiers);
 }
 
-void BindingNode::emitBytecode(BytecodeGenerator& generator, RegisterID* value) const
+void BindingNode::bindValue(BytecodeGenerator& generator, RegisterID* value) const
 {
     if (Local local = generator.local(m_boundProperty)) {
         if (local.isReadOnly()) {

Modified: trunk/Source/_javascript_Core/parser/Nodes.h (158050 => 158051)


--- trunk/Source/_javascript_Core/parser/Nodes.h	2013-10-25 20:59:15 UTC (rev 158050)
+++ trunk/Source/_javascript_Core/parser/Nodes.h	2013-10-25 21:31:36 UTC (rev 158051)
@@ -1574,7 +1574,7 @@
 
     public:
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const = 0;
-        virtual void emitBytecode(BytecodeGenerator&, RegisterID* source) const = 0;
+        virtual void bindValue(BytecodeGenerator&, RegisterID* source) const = 0;
         virtual void toString(StringBuilder&) const = 0;
 
         virtual bool isBindingNode() const { return false; }
@@ -1597,7 +1597,7 @@
     private:
         ArrayPatternNode(VM*);
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const OVERRIDE;
-        virtual void emitBytecode(BytecodeGenerator&, RegisterID*) const OVERRIDE;
+        virtual void bindValue(BytecodeGenerator&, RegisterID*) const OVERRIDE;
         virtual RegisterID* emitDirectBinding(BytecodeGenerator&, RegisterID* dst, ExpressionNode*) OVERRIDE;
         virtual void toString(StringBuilder&) const OVERRIDE;
 
@@ -1615,7 +1615,7 @@
     private:
         ObjectPatternNode(VM*);
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const OVERRIDE;
-        virtual void emitBytecode(BytecodeGenerator&, RegisterID*) const OVERRIDE;
+        virtual void bindValue(BytecodeGenerator&, RegisterID*) const OVERRIDE;
         virtual void toString(StringBuilder&) const OVERRIDE;
         struct Entry {
             Entry(const Identifier& propertyName, bool wasString, DeconstructionPatternNode* pattern)
@@ -1640,7 +1640,7 @@
         BindingNode(VM*, const Identifier& boundProperty, const JSTextPosition& divot, const JSTextPosition& start, const JSTextPosition& end);
 
         virtual void collectBoundIdentifiers(Vector<Identifier>&) const OVERRIDE;
-        virtual void emitBytecode(BytecodeGenerator&, RegisterID*) const OVERRIDE;
+        virtual void bindValue(BytecodeGenerator&, RegisterID*) const OVERRIDE;
         virtual void toString(StringBuilder&) const OVERRIDE;
         
         virtual bool isBindingNode() const OVERRIDE { return true; }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to