| Index: test/mjsunit/regress/regress-crbug-594183.js
|
| diff --git a/test/mjsunit/regress/regress-crbug-594183.js b/test/mjsunit/regress/regress-crbug-594183.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c87e32545828e470dd851801f53a8e6d7b44f65f
|
| --- /dev/null
|
| +++ b/test/mjsunit/regress/regress-crbug-594183.js
|
| @@ -0,0 +1,82 @@
|
| +// Copyright 2016 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 global = {}
|
| +
|
| +var fish = [
|
| + {'name': 'foo'},
|
| + {'name': 'bar'},
|
| +];
|
| +
|
| +for (var i = 0; i < fish.length; i++) {
|
| + global[fish[i].name] = 1;
|
| +}
|
| +
|
| +function load() {
|
| + var sum = 0;
|
| + for (var i = 0; i < fish.length; i++) {
|
| + var name = fish[i].name;
|
| + sum += global[name];
|
| + }
|
| + return sum;
|
| +}
|
| +
|
| +load();
|
| +load();
|
| +%OptimizeFunctionOnNextCall(load);
|
| +load();
|
| +assertOptimized(load);
|
| +
|
| +function store() {
|
| + for (var i = 0; i < fish.length; i++) {
|
| + var name = fish[i].name;
|
| + global[name] = 1;
|
| + }
|
| +}
|
| +
|
| +store();
|
| +store();
|
| +%OptimizeFunctionOnNextCall(store);
|
| +store();
|
| +assertOptimized(store);
|
| +
|
| +// Regression test for KeyedStoreIC bug: would use PROPERTY mode erroneously.
|
| +
|
| +function store_element(obj, key) {
|
| + obj[key] = 0;
|
| +}
|
| +
|
| +var o1 = new Array(3);
|
| +var o2 = new Array(3);
|
| +o2.o2 = "o2";
|
| +var o3 = new Array(3);
|
| +o3.o3 = "o3";
|
| +var o4 = new Array(3);
|
| +o4.o4 = "o4";
|
| +var o5 = new Array(3);
|
| +o5.o5 = "o5";
|
| +// Make the KeyedStoreIC megamorphic.
|
| +store_element(o1, 0); // Premonomorphic
|
| +store_element(o1, 0); // Monomorphic
|
| +store_element(o2, 0); // 2-way polymorphic.
|
| +store_element(o3, 0); // 3-way polymorphic.
|
| +store_element(o4, 0); // 4-way polymorphic.
|
| +store_element(o5, 0); // Megamorphic.
|
| +
|
| +function inferrable_store(key) {
|
| + store_element(o5, key);
|
| +}
|
| +
|
| +inferrable_store(0);
|
| +inferrable_store(0);
|
| +%OptimizeFunctionOnNextCall(inferrable_store);
|
| +inferrable_store(0);
|
| +assertOptimized(inferrable_store);
|
| +// If |inferrable_store| emitted a generic keyed store, it won't deopt upon
|
| +// seeing a property name key. It should have inferred a receiver map and
|
| +// emitted an elements store, however.
|
| +inferrable_store("deopt");
|
| +assertUnoptimized(inferrable_store);
|
|
|