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; }