2e9902b22a
Semantics of elements accessors are now preserved in all optimized code paths through Array.push(). Previously it was possible to have inconsistent behavior between optimized and unoptimized code, and there were cases where element accessors were completely ingored. R=verwaest@chromium.org Review URL: https://codereview.chromium.org/232873002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20655 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
61 lines
1.5 KiB
JavaScript
61 lines
1.5 KiB
JavaScript
// Copyright 2014 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
var v = 0;
|
|
var my_array_proto = {};
|
|
my_array_proto.__proto__ = [].__proto__;
|
|
Object.defineProperty(my_array_proto, "0", {
|
|
get: function() { return "get " + v; },
|
|
set: function(value) { v += value; }
|
|
});
|
|
|
|
|
|
// Test that element accessors are called in standard push cases.
|
|
array = [];
|
|
array.__proto__ = my_array_proto;
|
|
|
|
array[0] = 10;
|
|
assertEquals(0, array.length);
|
|
assertEquals(10, v);
|
|
assertEquals("get 10", array[0]);
|
|
|
|
Array.prototype.push.call(array, 100);
|
|
assertEquals(1, array.length);
|
|
assertEquals(110, v);
|
|
assertEquals("get 110", array[0]);
|
|
|
|
array = [];
|
|
array.__proto__ = my_array_proto;
|
|
|
|
assertEquals(0, array.length);
|
|
array.push(110);
|
|
assertEquals(1, array.length);
|
|
assertEquals(220, v);
|
|
assertEquals("get 220", array[0]);
|
|
|
|
// Test that elements setters/getters on prototype chain are property detected
|
|
// and don't lead to overzealous optimization.
|
|
v = 0;
|
|
function push_wrapper_1(array, value) {
|
|
array.push(value);
|
|
}
|
|
array = [];
|
|
array.__proto__ = my_array_proto;
|
|
push_wrapper_1(array, 100);
|
|
assertEquals(1, array.length);
|
|
assertEquals(100, v);
|
|
push_wrapper_1(array, 100);
|
|
assertEquals(2, array.length);
|
|
assertEquals(100, v);
|
|
assertEquals("get 100", array[0]);
|
|
%OptimizeFunctionOnNextCall(push_wrapper_1);
|
|
array = [];
|
|
array.__proto__ = my_array_proto;
|
|
push_wrapper_1(array, 100);
|
|
assertEquals(1, array.length);
|
|
assertEquals(200, v);
|
|
assertEquals("get 200", array[0]);
|