| // Copyright 2017 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-flush-bytecode --no-stress-flush-bytecode | |
| /* Test MapCheck behavior */ | |
| (function testForEachMapCheck() { | |
| function f(v,n,o) { | |
| Object.freeze(o); | |
| } | |
| function g() { | |
| [1,2,3].forEach(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| assertOptimized(g); | |
| })(); | |
| (function testFindMapCheck() { | |
| function f(v,n,o) { | |
| Object.freeze(o); | |
| return false; | |
| } | |
| function g() { | |
| [1,2,3].find(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| assertOptimized(g); | |
| })(); | |
| (function testMapMapCheck() { | |
| function f(v,n,o) { | |
| Object.freeze(o); | |
| return false; | |
| } | |
| function g() { | |
| [1,2,3].map(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| assertOptimized(g); | |
| })(); | |
| (function testFilterMapCheck() { | |
| function f(v,n,o) { | |
| Object.freeze(o); | |
| return true; | |
| } | |
| function g() { | |
| [1,2,3].filter(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| assertOptimized(g); | |
| })(); | |
| /* Test CheckBounds behavior */ | |
| (function testForEachCheckBounds() { | |
| function f(v,n,o) { | |
| o.length=2; | |
| } | |
| function g() { | |
| [1,2,3].forEach(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| assertOptimized(g); | |
| })(); | |
| (function testFindCheckBounds() { | |
| function f(v,n,o) { | |
| o.length=2; | |
| return false; | |
| } | |
| function g() { | |
| [1,2,3].find(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| assertOptimized(g); | |
| })(); | |
| (function testMapCheckBounds() { | |
| function f(v,n,o) { | |
| o.length=2; | |
| return false; | |
| } | |
| function g() { | |
| [1,2,3].map(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| assertOptimized(g); | |
| })(); | |
| (function testFilterCheckBounds() { | |
| function f(v,n,o) { | |
| o.length = 2; | |
| return true; | |
| } | |
| function g() { | |
| [1,2,3].filter(f); | |
| } | |
| %PrepareFunctionForOptimization(g); | |
| g(); | |
| g(); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| g(); | |
| %PrepareFunctionForOptimization(g); | |
| %OptimizeFunctionOnNextCall(g); | |
| g(); | |
| g(); | |
| assertOptimized(g); | |
| })(); |