// 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 --opt --no-always-opt 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"); // TurboFan is not sophisticated enough to use key type provided by ICs. if (!isTurboFanned(inferrable_store)) { assertUnoptimized(inferrable_store); }