| // 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); | |
| })(); |