Fix overwriting order of object literal properties for MATERIALIZED_LITERALs
R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/22982005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16179 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
bbd28067a2
commit
b3b99969b0
@ -273,7 +273,8 @@ void ObjectLiteral::CalculateEmitStore(Zone* zone) {
|
|||||||
uint32_t hash = literal->Hash();
|
uint32_t hash = literal->Hash();
|
||||||
// If the key of a computed property is in the table, do not emit
|
// If the key of a computed property is in the table, do not emit
|
||||||
// a store for the property later.
|
// a store for the property later.
|
||||||
if (property->kind() == ObjectLiteral::Property::COMPUTED &&
|
if ((property->kind() == ObjectLiteral::Property::MATERIALIZED_LITERAL ||
|
||||||
|
property->kind() == ObjectLiteral::Property::COMPUTED) &&
|
||||||
table.Lookup(literal, hash, false, allocator) != NULL) {
|
table.Lookup(literal, hash, false, allocator) != NULL) {
|
||||||
property->set_emit_store(false);
|
property->set_emit_store(false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
// Flags: --allow-natives-syntax
|
||||||
|
|
||||||
// Check that constants and computed properties are overwriting each other
|
// Check that constants and computed properties are overwriting each other
|
||||||
// correctly, i.e., the last initializer for any name is stored in the object.
|
// correctly, i.e., the last initializer for any name is stored in the object.
|
||||||
|
|
||||||
@ -49,7 +51,7 @@ var foo3 = {
|
|||||||
|
|
||||||
var foo4 = {
|
var foo4 = {
|
||||||
bar: function(b){},
|
bar: function(b){},
|
||||||
bar: 7,
|
bar: 4,
|
||||||
bar: function(){return 7},
|
bar: function(){return 7},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -68,6 +70,14 @@ var foo7 = {
|
|||||||
15: 7
|
15: 7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function foo8(i) {
|
||||||
|
var obj = {
|
||||||
|
x: {a: i},
|
||||||
|
x: 7
|
||||||
|
};
|
||||||
|
return obj.x;
|
||||||
|
};
|
||||||
|
|
||||||
assertEquals(7, foo1.bar);
|
assertEquals(7, foo1.bar);
|
||||||
assertEquals(7, foo2.bar);
|
assertEquals(7, foo2.bar);
|
||||||
assertEquals(7, foo3.bar);
|
assertEquals(7, foo3.bar);
|
||||||
@ -76,6 +86,12 @@ assertEquals(7, foo5[13]);
|
|||||||
assertEquals(7, foo6[14.31]);
|
assertEquals(7, foo6[14.31]);
|
||||||
assertEquals(7, foo7[15]);
|
assertEquals(7, foo7[15]);
|
||||||
|
|
||||||
|
assertEquals(7, foo8(1));
|
||||||
|
assertEquals(7, foo8(1));
|
||||||
|
%OptimizeFunctionOnNextCall(foo8);
|
||||||
|
assertEquals(7, foo8(1));
|
||||||
|
|
||||||
|
|
||||||
// Test for the classic code generator.
|
// Test for the classic code generator.
|
||||||
|
|
||||||
function fun(x) {
|
function fun(x) {
|
||||||
|
Loading…
Reference in New Issue
Block a user