| 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: --allow-natives-syntax --harmony-async-await --expose-debug-as debug | 5 // Flags: --allow-natives-syntax --harmony-async-await --expose-debug-as debug | 
| 6 | 6 | 
| 7 Debug = debug.Debug | 7 Debug = debug.Debug | 
| 8 | 8 | 
| 9 let events = 0; | 9 let events = 0; | 
| 10 | 10 | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 24 async function scalar() { return 1; } | 24 async function scalar() { return 1; } | 
| 25 | 25 | 
| 26 function nothing() { return 1; } | 26 function nothing() { return 1; } | 
| 27 | 27 | 
| 28 function rejectConstructor() { | 28 function rejectConstructor() { | 
| 29   return new Promise((resolve, reject) => reject("c"));  // Exception c | 29   return new Promise((resolve, reject) => reject("c"));  // Exception c | 
| 30 } | 30 } | 
| 31 | 31 | 
| 32 async function argThrower(x = (() => { throw "d"; })()) { }  // Exception d | 32 async function argThrower(x = (() => { throw "d"; })()) { }  // Exception d | 
| 33 | 33 | 
|  | 34 async function awaitThrow() { | 
|  | 35   await undefined; | 
|  | 36   throw "e";  // Exception e | 
|  | 37 } | 
|  | 38 | 
|  | 39 function constructorThrow() { | 
|  | 40   return new Promise((resolve, reject) => | 
|  | 41     Promise.resolve().then(() => | 
|  | 42       reject("f")  // Exception f | 
|  | 43     ) | 
|  | 44   ); | 
|  | 45 } | 
|  | 46 | 
| 34 function suppressThrow() { | 47 function suppressThrow() { | 
| 35   return thrower(); | 48   return thrower(); | 
| 36 } | 49 } | 
| 37 | 50 | 
| 38 async function caught(producer) { | 51 async function caught(producer) { | 
| 39   try { | 52   try { | 
| 40     await producer(); | 53     await producer(); | 
| 41   } catch (e) { | 54   } catch (e) { | 
| 42   } | 55   } | 
| 43 } | 56 } | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 73   Promise.resolve(producer()).then().catch(() => {}); | 86   Promise.resolve(producer()).then().catch(() => {}); | 
| 74 } | 87 } | 
| 75 | 88 | 
| 76 async function indirectAwaitCatch(producer) { | 89 async function indirectAwaitCatch(producer) { | 
| 77   try { | 90   try { | 
| 78     await (() => producer())(); | 91     await (() => producer())(); | 
| 79   } catch (e) { | 92   } catch (e) { | 
| 80   } | 93   } | 
| 81 } | 94 } | 
| 82 | 95 | 
| 83 let catches = [caught, indirectCaught, indirectAwaitCatch]; | 96 function switchCatch(producer) { | 
|  | 97   let resolve; | 
|  | 98   let promise = new Promise(r => resolve = r); | 
|  | 99   async function localCaught() { | 
|  | 100     try { | 
|  | 101       await promise;  // force switching to localUncaught and back | 
|  | 102       await producer(); | 
|  | 103     } catch (e) { } | 
|  | 104   } | 
|  | 105   async function localUncaught() { | 
|  | 106     await undefined; | 
|  | 107     resolve(); | 
|  | 108   } | 
|  | 109   localCaught(); | 
|  | 110   localUncaught(); | 
|  | 111 } | 
|  | 112 | 
|  | 113 function switchDotCatch(producer) { | 
|  | 114   let resolve; | 
|  | 115   let promise = new Promise(r => resolve = r); | 
|  | 116   async function localCaught() { | 
|  | 117     await promise;  // force switching to localUncaught and back | 
|  | 118     await producer(); | 
|  | 119   } | 
|  | 120   async function localUncaught() { | 
|  | 121     await undefined; | 
|  | 122     resolve(); | 
|  | 123   } | 
|  | 124   localCaught().catch(() => {}); | 
|  | 125   localUncaught(); | 
|  | 126 } | 
|  | 127 | 
|  | 128 let catches = [caught, | 
|  | 129                indirectCaught, | 
|  | 130                indirectAwaitCatch, | 
|  | 131                switchCatch, | 
|  | 132                switchDotCatch]; | 
| 84 let noncatches = [uncaught, indirectUncaught]; | 133 let noncatches = [uncaught, indirectUncaught]; | 
| 85 let lateCatches = [dotCatch, | 134 let lateCatches = [dotCatch, | 
| 86                    indirectReturnDotCatch, | 135                    indirectReturnDotCatch, | 
| 87                    indirectAwaitDotCatch, | 136                    indirectAwaitDotCatch, | 
| 88                    nestedDotCatch]; | 137                    nestedDotCatch]; | 
| 89 | 138 | 
| 90 let throws = [thrower, reject, argThrower, suppressThrow]; | 139 let throws = [thrower, reject, argThrower, suppressThrow]; | 
| 91 let nonthrows = [awaitReturn, scalar, nothing]; | 140 let nonthrows = [awaitReturn, scalar, nothing]; | 
|  | 141 let lateThrows = [awaitThrow, constructorThrow]; | 
| 92 let uncatchable = [rejectConstructor]; | 142 let uncatchable = [rejectConstructor]; | 
| 93 | 143 | 
| 94 let cases = []; | 144 let cases = []; | 
| 95 | 145 | 
| 96 for (let producer of throws) { | 146 for (let producer of throws.concat(lateThrows)) { | 
| 97   for (let consumer of catches) { | 147   for (let consumer of catches) { | 
| 98     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 148     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 
| 99     cases.push({ producer, consumer, expectedEvents: 0, caught: false }); | 149     cases.push({ producer, consumer, expectedEvents: 0, caught: false }); | 
| 100   } | 150   } | 
| 101 } | 151 } | 
| 102 | 152 | 
| 103 for (let producer of throws) { | 153 for (let producer of throws.concat(lateThrows)) { | 
| 104   for (let consumer of noncatches) { | 154   for (let consumer of noncatches) { | 
| 105     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 155     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 
| 106     cases.push({ producer, consumer, expectedEvents: 1, caught: false }); | 156     cases.push({ producer, consumer, expectedEvents: 1, caught: false }); | 
| 107   } | 157   } | 
| 108 } | 158 } | 
| 109 | 159 | 
| 110 for (let producer of nonthrows) { | 160 for (let producer of nonthrows) { | 
| 111   for (let consumer of catches.concat(noncatches, lateCatches)) { | 161   for (let consumer of catches.concat(noncatches, lateCatches)) { | 
| 112     cases.push({ producer, consumer, expectedEvents: 0, caught: true }); | 162     cases.push({ producer, consumer, expectedEvents: 0, caught: true }); | 
| 113     cases.push({ producer, consumer, expectedEvents: 0, caught: false }); | 163     cases.push({ producer, consumer, expectedEvents: 0, caught: false }); | 
| 114   } | 164   } | 
| 115 } | 165 } | 
| 116 | 166 | 
| 117 for (let producer of uncatchable) { | 167 for (let producer of uncatchable) { | 
| 118   for (let consumer of catches.concat(noncatches, lateCatches)) { | 168   for (let consumer of catches.concat(noncatches, lateCatches)) { | 
| 119     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 169     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 
| 120     cases.push({ producer, consumer, expectedEvents: 1, caught: false }); | 170     cases.push({ producer, consumer, expectedEvents: 1, caught: false }); | 
| 121   } | 171   } | 
| 122 } | 172 } | 
| 123 | 173 | 
|  | 174 for (let producer of lateThrows) { | 
|  | 175   for (let consumer of lateCatches) { | 
|  | 176     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 
|  | 177     cases.push({ producer, consumer, expectedEvents: 0, caught: false }); | 
|  | 178   } | 
|  | 179 } | 
|  | 180 | 
| 124 for (let producer of throws) { | 181 for (let producer of throws) { | 
| 125   for (let consumer of lateCatches) { | 182   for (let consumer of lateCatches) { | 
| 126     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 183     cases.push({ producer, consumer, expectedEvents: 1, caught: true }); | 
| 127     cases.push({ producer, consumer, expectedEvents: 1, caught: false }); | 184     cases.push({ producer, consumer, expectedEvents: 1, caught: false }); | 
| 128   } | 185   } | 
| 129 } | 186 } | 
| 130 | 187 | 
| 131 for (let {producer, consumer, expectedEvents, caught} of cases) { | 188 for (let {producer, consumer, expectedEvents, caught} of cases) { | 
| 132   Debug.setListener(listener); | 189   Debug.setListener(listener); | 
| 133   if (caught) | 190   if (caught) | 
| 134     Debug.setBreakOnException(); | 191     Debug.setBreakOnException(); | 
| 135   else | 192   else | 
| 136     Debug.setBreakOnUncaughtException(); | 193     Debug.setBreakOnUncaughtException(); | 
| 137 | 194 | 
| 138   events = 0; | 195   events = 0; | 
| 139   consumer(producer); | 196   consumer(producer); | 
| 140   %RunMicrotasks(); | 197   %RunMicrotasks(); | 
| 141 | 198 | 
| 142   Debug.setListener(null); | 199   Debug.setListener(null); | 
| 143   if (caught) Debug.clearBreakOnException(); | 200   if (caught) Debug.clearBreakOnException(); | 
| 144   else Debug.clearBreakOnUncaughtException(); | 201   else Debug.clearBreakOnUncaughtException(); | 
| 145   if (expectedEvents != events) { | 202   if (expectedEvents != events) { | 
| 146     print(`producer ${producer} consumer ${consumer} expectedEvents ` + | 203     print(`producer ${producer} consumer ${consumer} expectedEvents ` + | 
| 147           `${expectedEvents} caught ${caught} events ${events}`); | 204           `${expectedEvents} caught ${caught} events ${events}`); | 
| 148     quit(1); | 205     quit(1); | 
| 149   } | 206   } | 
| 150 } | 207 } | 
| OLD | NEW | 
|---|