| OLD | NEW | 
|    1 // Copyright 2016 the V8 project authors. All rights reserved. |    1 // Copyright 2016 the V8 project authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 // Flags: --turbo --turbo-escape --allow-natives-syntax |    5 // Flags: --turbo --turbo-escape --allow-natives-syntax | 
|    6  |    6  | 
|    7 "use strict"; |    7 "use strict"; | 
|    8  |    8  | 
|    9 const kDeoptimized = 2; |  | 
|   10 const kTurbofanned = 7; |  | 
|   11 const kInterpreted = 8; |  | 
|   12  |  | 
|   13 function GetOptimizationStatus(fn) { |  | 
|   14   let status = %GetOptimizationStatus(fn); |  | 
|   15   switch (status) { |  | 
|   16   case kInterpreted: // Treat interpreted frames as unoptimized |  | 
|   17     status = kDeoptimized; |  | 
|   18     break; |  | 
|   19   } |  | 
|   20  |  | 
|   21   return status; |  | 
|   22 } |  | 
|   23  |  | 
|   24 let global = this; |    9 let global = this; | 
|   25 let tests = { |   10 let tests = { | 
|   26   FastElementsKind() { |   11   FastElementsKind() { | 
|   27     let runners = { |   12     let runners = { | 
|   28       FAST_SMI_ELEMENTS(array) { |   13       FAST_SMI_ELEMENTS(array) { | 
|   29         let sum = 0; |   14         let sum = 0; | 
|   30         for (let x of array) sum += x; |   15         for (let x of array) sum += x; | 
|   31         return sum; |   16         return sum; | 
|   32       }, |   17       }, | 
|   33  |   18  | 
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  111       let { array, expected, array2, expected2 } = tests[key]; |   96       let { array, expected, array2, expected2 } = tests[key]; | 
|  112  |   97  | 
|  113       // Warmup: |   98       // Warmup: | 
|  114       fn(array); |   99       fn(array); | 
|  115       fn(array); |  100       fn(array); | 
|  116       %OptimizeFunctionOnNextCall(fn); |  101       %OptimizeFunctionOnNextCall(fn); | 
|  117       fn(array); |  102       fn(array); | 
|  118  |  103  | 
|  119       // TODO(bmeurer): FAST_HOLEY_DOUBLE_ELEMENTS maps generally deopt when |  104       // TODO(bmeurer): FAST_HOLEY_DOUBLE_ELEMENTS maps generally deopt when | 
|  120       // a hole is encountered. Test should be fixed once that is corrected. |  105       // a hole is encountered. Test should be fixed once that is corrected. | 
|  121       let status = /HOLEY_DOUBLE/.test(key) ? kDeoptimized : kTurbofanned; |  106       let expect_deopt = /HOLEY_DOUBLE/.test(key); | 
|  122  |  107  | 
|  123       assertEquals(status, GetOptimizationStatus(fn), key); |  108       if (expect_deopt) { | 
 |  109         assertUnoptimized(fn, '', key); | 
 |  110       } else { | 
 |  111         assertOptimized(fn, '', key); | 
 |  112       } | 
|  124       assertEquals(expected, fn(array), key); |  113       assertEquals(expected, fn(array), key); | 
|  125       assertEquals(status, GetOptimizationStatus(fn), key); |  114       if (expect_deopt) { | 
 |  115         assertUnoptimized(fn, '', key); | 
 |  116       } else { | 
 |  117         assertOptimized(fn, '', key); | 
 |  118       } | 
|  126  |  119  | 
|  127       // Check no deopt when another arra with the same map is used |  120       // Check no deopt when another array with the same map is used | 
|  128       assertTrue(%HaveSameMap(array, array2), key); |  121       assertTrue(%HaveSameMap(array, array2), key); | 
|  129       assertEquals(status, GetOptimizationStatus(fn), key); |  122       if (expect_deopt) { | 
 |  123         assertUnoptimized(fn, '', key); | 
 |  124       } else { | 
 |  125         assertOptimized(fn, '', key); | 
 |  126       } | 
|  130       assertEquals(expected2, fn(array2), key); |  127       assertEquals(expected2, fn(array2), key); | 
|  131  |  128  | 
|  132       // CheckMaps bailout |  129       // CheckMaps bailout | 
|  133       let newArray = Object.defineProperty( |  130       let newArray = Object.defineProperty( | 
|  134           [1, 2, 3], 2, { enumerable: false, configurable: false, |  131           [1, 2, 3], 2, { enumerable: false, configurable: false, | 
|  135                           get() { return 7; } }); |  132                           get() { return 7; } }); | 
|  136       fn(newArray); |  133       fn(newArray); | 
|  137       assertEquals(kDeoptimized, GetOptimizationStatus(fn), key); |  134       assertUnoptimized(fn, '', key); | 
|  138     } |  135     } | 
|  139   }, |  136   }, | 
|  140  |  137  | 
|  141   TypedArrays() { |  138   TypedArrays() { | 
|  142     let tests = { |  139     let tests = { | 
|  143       Uint8Array: { |  140       Uint8Array: { | 
|  144         array: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, -1, 256]), |  141         array: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, -1, 256]), | 
|  145         expected: 291, |  142         expected: 291, | 
|  146         array2: new Uint8Array([1, 2, 3]), |  143         array2: new Uint8Array([1, 2, 3]), | 
|  147         expected2: 6 |  144         expected2: 6 | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  215         for (let x of array) ret += x; |  212         for (let x of array) ret += x; | 
|  216         return ret; |  213         return ret; | 
|  217       }; |  214       }; | 
|  218  |  215  | 
|  219       // Warmup |  216       // Warmup | 
|  220       sum(array); |  217       sum(array); | 
|  221       sum(array); |  218       sum(array); | 
|  222       %OptimizeFunctionOnNextCall(sum); |  219       %OptimizeFunctionOnNextCall(sum); | 
|  223       assertEquals(expected, sum(array), key); |  220       assertEquals(expected, sum(array), key); | 
|  224  |  221  | 
|  225       assertEquals(kTurbofanned, GetOptimizationStatus(sum), key); |  222       assertOptimized(sum, '', key); | 
|  226  |  223  | 
|  227       // Not deoptimized when called on typed array of same type / map |  224       // Not deoptimized when called on typed array of same type / map | 
|  228       assertTrue(%HaveSameMap(array, array2)); |  225       assertTrue(%HaveSameMap(array, array2)); | 
|  229       assertEquals(expected2, sum(array2), key); |  226       assertEquals(expected2, sum(array2), key); | 
|  230       assertEquals(kTurbofanned, GetOptimizationStatus(sum), key); |  227       assertOptimized(sum, '', key); | 
|  231  |  228  | 
|  232       // Throw when detached |  229       // Throw when detached | 
|  233       let clone = new array.constructor(array); |  230       let clone = new array.constructor(array); | 
|  234       %ArrayBufferNeuter(clone.buffer); |  231       %ArrayBufferNeuter(clone.buffer); | 
|  235       assertThrows(() => sum(clone), TypeError); |  232       assertThrows(() => sum(clone), TypeError); | 
|  236     } |  233     } | 
|  237   } |  234   } | 
|  238 }; |  235 }; | 
|  239  |  236  | 
|  240 for (let name of Object.keys(tests)) { |  237 for (let name of Object.keys(tests)) { | 
|  241   let test = tests[name]; |  238   let test = tests[name]; | 
|  242   test(); |  239   test(); | 
|  243 } |  240 } | 
| OLD | NEW |