| // 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 |
| |
| // Test side effects on arguments evaluation. |
| (function() { |
| const a = []; |
| const bar = x => { a.push(x); return x; }; |
| const foo = x => a.push(bar(x), bar(x)); |
| %PrepareFunctionForOptimization(foo); |
| foo(1); |
| foo(2); |
| %OptimizeFunctionOnNextCall(foo); |
| foo(3); |
| assertEquals([1,1,1,1, 2,2,2,2, 3,3,3,3], a); |
| })(); |
| |
| // Test invalidation on arguments evaluation. |
| (function() { |
| let y = 1; |
| const a = []; |
| const bar = x => { a.push(y); return x; } |
| const foo = x => a.push(bar(x), bar(x)); |
| %PrepareFunctionForOptimization(foo); |
| foo(1); |
| y = 2; |
| foo(2); |
| %OptimizeFunctionOnNextCall(foo); |
| y = 3; |
| foo(3); |
| assertOptimized(foo); |
| y = 4.4; |
| foo(4); |
| assertEquals([1,1,1,1, 2,2,2,2, 3,3,3,3, 4.4,4.4,4,4], a); |
| })(); |
| (function() { |
| let y = 1; |
| const a = [0.5]; |
| const bar = x => { a.push(y); return x; } |
| const foo = x => a.push(bar(x), bar(x)); |
| %PrepareFunctionForOptimization(foo); |
| foo(1); |
| y = 2; |
| foo(2); |
| %OptimizeFunctionOnNextCall(foo); |
| y = 3; |
| foo(3); |
| assertOptimized(foo); |
| y = '4'; |
| foo(4); |
| assertEquals([0.5, 1,1,1,1, 2,2,2,2, 3,3,3,3, '4','4',4,4], a); |
| })(); |