+2015-01-22 Ryosuke Niwa <rniwa@webkit.org>
+
+ PropertyListNode::emitNode duplicates the code to put a constant property
+ https://bugs.webkit.org/show_bug.cgi?id=140761
+
+ Reviewed by Geoffrey Garen.
+
+ Extracted PropertyListNode::emitPutConstantProperty to share the code.
+
+ Also made PropertyListNode::emitBytecode private since nobody is calling this function directly.
+
+ * bytecompiler/NodesCodegen.cpp:
+ (JSC::PropertyListNode::emitBytecode):
+ (JSC::PropertyListNode::emitPutConstantProperty): Added.
+ * parser/Nodes.h:
+
2015-01-22 Yusuke Suzuki <utatane.tea@gmail.com>
put_by_val_direct need to check the property is index or not for using putDirect / putDirectIndex
// Fast case: this loop just handles regular value properties.
PropertyListNode* p = this;
- for (; p && p->m_node->m_type == PropertyNode::Constant; p = p->m_next) {
- if (p->m_node->m_name) {
- generator.emitDirectPutById(newObj.get(), *p->m_node->name(), generator.emitNode(p->m_node->m_assign));
- continue;
- }
- RefPtr<RegisterID> propertyName = generator.emitNode(p->m_node->m_expression);
- generator.emitDirectPutByVal(newObj.get(), propertyName.get(), generator.emitNode(p->m_node->m_assign));
- }
+ for (; p && p->m_node->m_type == PropertyNode::Constant; p = p->m_next)
+ emitPutConstantProperty(generator, newObj.get(), *p->m_node);
// Were there any get/set properties?
if (p) {
// Handle regular values.
if (node->m_type == PropertyNode::Constant) {
- if (node->name()) {
- generator.emitDirectPutById(newObj.get(), *node->name(), generator.emitNode(node->m_assign));
- continue;
- }
- RefPtr<RegisterID> propertyName = generator.emitNode(p->m_node->m_expression);
- generator.emitDirectPutByVal(newObj.get(), propertyName.get(), generator.emitNode(p->m_node->m_assign));
+ emitPutConstantProperty(generator, newObj.get(), *node);
continue;
}
-
+
RegisterID* value = generator.emitNode(node->m_assign);
// This is a get/set property, find its entry in the map.
return generator.moveToDestinationIfNeeded(dst, newObj.get());
}
+void PropertyListNode::emitPutConstantProperty(BytecodeGenerator& generator, RegisterID* newObj, PropertyNode& node)
+{
+ if (node.name()) {
+ generator.emitDirectPutById(newObj, *node.name(), generator.emitNode(node.m_assign));
+ return;
+ }
+ RefPtr<RegisterID> propertyName = generator.emitNode(node.m_expression);
+ generator.emitDirectPutByVal(newObj, propertyName.get(), generator.emitNode(node.m_assign));
+}
+
// ------------------------------ BracketAccessorNode --------------------------------
RegisterID* BracketAccessorNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
PropertyListNode(const JSTokenLocation&, PropertyNode*);
PropertyListNode(const JSTokenLocation&, PropertyNode*, PropertyListNode*);
+ private:
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
+ void emitPutConstantProperty(BytecodeGenerator&, RegisterID*, PropertyNode&);
- private:
PropertyNode* m_node;
PropertyListNode* m_next;
};