Chromium Code Reviews| Index: test/mjsunit/mjsunit.js |
| diff --git a/test/mjsunit/mjsunit.js b/test/mjsunit/mjsunit.js |
| index 88d4d3677c4edc84fc2e9128737083cb246a64bb..ad8c511bc85fdcd6770360b886e7dfd2c7e1e243 100644 |
| --- a/test/mjsunit/mjsunit.js |
| +++ b/test/mjsunit/mjsunit.js |
| @@ -120,6 +120,38 @@ var assertContains; |
| // Assert that a string matches a given regex. |
| var assertMatches; |
| +// These bits must be in sync with bits defined in Runtime_GetOptimizationStatus |
| +var V8OptimizationStatus = { |
| + kIsFunction: 1 << 0, |
| + kNeverOptimize: 1 << 1, |
| + kAlwaysOptimize: 1 << 2, |
| + kMaybeDeopted: 1 << 3, |
| + kOptimized: 1 << 4, |
| + kTurboFanned: 1 << 5, |
| + kInterpreted: 1 << 6 |
| +}; |
| + |
| +// Returns true if --no-crankshaft mode is on. |
| +var isNeverOptimize; |
| + |
| +// Returns true if --always-opt mode is on. |
| +var isAlwaysOptimize; |
| + |
| +// Returns true if given function in interpreted. |
| +var isInterpreted; |
| + |
| +// Returns true if given function is compiled by a base-line compiler. |
| +var isBaselined; |
| + |
| +// Returns true if given function is optimized. |
| +var isOptimized; |
| + |
| +// Returns true if given function is compiled by Crankshaft. |
| +var isCrankshafted; |
| + |
| +// Returns true if given function is compiled by TurboFan. |
| +var isTurboFanned; |
| + |
| (function () { // Scope for utility functions. |
| @@ -462,12 +494,81 @@ var assertMatches; |
| assertUnoptimized = function assertUnoptimized(fun, sync_opt, name_opt) { |
| if (sync_opt === undefined) sync_opt = ""; |
| - assertTrue(OptimizationStatus(fun, sync_opt) !== 1, name_opt); |
| + var opt_status = OptimizationStatus(fun, sync_opt); |
| + // Tests that use assertOptimized() do not make sense if --always-opt |
| + // option is provided. Such tests must add --no-always-opt to flags comment. |
| + assertFalse((opt_status & V8OptimizationStatus.kAlwaysOptimize) !== 0, |
| + "test does not make sense with --always-opt"); |
| + assertTrue((opt_status & V8OptimizationStatus.kIsFunction) !== 0, name_opt); |
| + assertFalse((opt_status & V8OptimizationStatus.kOptimized) !== 0, name_opt); |
| } |
| assertOptimized = function assertOptimized(fun, sync_opt, name_opt) { |
| if (sync_opt === undefined) sync_opt = ""; |
| - assertTrue(OptimizationStatus(fun, sync_opt) !== 2, name_opt); |
| + var opt_status = OptimizationStatus(fun, sync_opt); |
| + // Tests that use assertOptimized() do not make sense if --no-crankshaft |
| + // option is provided. Such tests must add --crankshaft to flags comment. |
| + assertFalse((opt_status & V8OptimizationStatus.kNeverOptimize) !== 0, |
| + "test does not make sense with --no-crankshaft"); |
| + assertTrue((opt_status & V8OptimizationStatus.kIsFunction) !== 0, name_opt); |
| + if ((opt_status & V8OptimizationStatus.kMaybeDeopted) !== 0) { |
|
Igor Sheludko
2017/01/27 09:33:06
This case is new.
Michael Starzinger
2017/01/27 10:10:24
Acknowledged.
|
| + // When --deopt-every-n-times flag is specified it's no longer guaranteed |
| + // that particular function is still optimized, so keep running the test |
| + // to stress test the deoptimizer. |
| + return; |
| + } |
| + assertTrue((opt_status & V8OptimizationStatus.kOptimized) !== 0, name_opt); |
| + } |
| + |
| + isNeverOptimize = function isNeverOptimize() { |
| + var opt_status = OptimizationStatus(undefined, ""); |
| + return (opt_status & V8OptimizationStatus.kNeverOptimize) !== 0; |
| + } |
| + |
| + isAlwaysOptimize = function isAlwaysOptimize() { |
| + var opt_status = OptimizationStatus(undefined, ""); |
| + return (opt_status & V8OptimizationStatus.kAlwaysOptimize) !== 0; |
| + } |
| + |
| + isInterpreted = function isInterpreted(fun) { |
| + var opt_status = OptimizationStatus(fun, ""); |
| + assertTrue((opt_status & V8OptimizationStatus.kIsFunction) !== 0, |
| + "not a function"); |
| + return (opt_status & V8OptimizationStatus.kOptimized) === 0 && |
| + (opt_status & V8OptimizationStatus.kInterpreted) !== 0; |
| + } |
| + |
| + // NOTE: This predicate also returns true for functions that have never |
| + // been compiled (i.e. that have LazyCompile stub as a code). |
| + isBaselined = function isBaselined(fun) { |
| + var opt_status = OptimizationStatus(fun, ""); |
| + assertTrue((opt_status & V8OptimizationStatus.kIsFunction) !== 0, |
| + "not a function"); |
| + return (opt_status & V8OptimizationStatus.kOptimized) === 0 && |
| + (opt_status & V8OptimizationStatus.kInterpreted) === 0; |
| + } |
| + |
| + isOptimized = function isOptimized(fun) { |
| + var opt_status = OptimizationStatus(fun, ""); |
| + assertTrue((opt_status & V8OptimizationStatus.kIsFunction) !== 0, |
| + "not a function"); |
| + return (opt_status & V8OptimizationStatus.kOptimized) !== 0; |
| + } |
| + |
| + isCrankshafted = function isCrankshafted(fun) { |
| + var opt_status = OptimizationStatus(fun, ""); |
| + assertTrue((opt_status & V8OptimizationStatus.kIsFunction) !== 0, |
| + "not a function"); |
| + return (opt_status & V8OptimizationStatus.kOptimized) !== 0 && |
| + (opt_status & V8OptimizationStatus.kTurboFanned) === 0; |
| + } |
| + |
| + isTurboFanned = function isTurboFanned(fun) { |
| + var opt_status = OptimizationStatus(fun, ""); |
| + assertTrue((opt_status & V8OptimizationStatus.kIsFunction) !== 0, |
| + "not a function"); |
| + return (opt_status & V8OptimizationStatus.kOptimized) !== 0 && |
| + (opt_status & V8OptimizationStatus.kTurboFanned) !== 0; |
| } |
| })(); |