Chromium Code Reviews| 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: --ignition-generators --harmony-do-expressions | 5 // Flags: --ignition-generators --harmony-do-expressions |
| 6 // Flags: --allow-natives-syntax --turbo --turbo-from-bytecode | |
|
Michael Starzinger
2016/05/10 10:53:05
As discussed offline: Let's drop the --turbo --tur
neis
2016/05/10 11:32:06
Done.
| |
| 7 | |
| 8 | |
| 9 function MaybeOptimizeOrDeoptimize(f) { | |
| 10 let x = Math.random(); // --random-seed makes this deterministic | |
| 11 if (x <= 0.33) { | |
| 12 %OptimizeFunctionOnNextCall(f); | |
| 13 } else if (x <= 0.66) { | |
| 14 %DeoptimizeFunction(f); | |
| 15 } | |
| 16 } | |
| 17 | |
| 18 function Next(generator, ...args) { | |
| 19 MaybeOptimizeOrDeoptimize(%GeneratorGetFunction(generator)); | |
| 20 return generator.next(...args); | |
| 21 } | |
| 22 | |
| 23 function Return(generator, ...args) { | |
| 24 MaybeOptimizeOrDeoptimize(%GeneratorGetFunction(generator)); | |
| 25 return generator.return(...args); | |
| 26 } | |
| 27 | |
| 28 function Throw(generator, ...args) { | |
| 29 MaybeOptimizeOrDeoptimize(%GeneratorGetFunction(generator)); | |
| 30 return generator.throw(...args); | |
| 31 } | |
| 6 | 32 |
| 7 | 33 |
| 8 { // yield in try-catch | 34 { // yield in try-catch |
| 9 | 35 |
| 10 let g = function*() { | 36 let g = function*() { |
| 11 try {yield 1} catch (error) {assertEquals("caught", error)} | 37 try {yield 1} catch (error) {assertEquals("caught", error)} |
| 12 }; | 38 }; |
| 13 | 39 |
| 14 assertThrowsEquals(() => g().throw("not caught"), "not caught"); | 40 assertThrowsEquals(() => Throw(g(), "not caught"), "not caught"); |
| 15 | 41 |
| 16 { | 42 { |
| 17 let x = g(); | 43 let x = g(); |
| 18 assertEquals({value: 1, done: false}, x.next()); | 44 assertEquals({value: 1, done: false}, Next(x)); |
| 19 assertEquals({value: undefined, done: true}, x.throw("caught")); | 45 assertEquals({value: undefined, done: true}, Throw(x, "caught")); |
| 20 } | 46 } |
| 21 | 47 |
| 22 { | 48 { |
| 23 let x = g(); | 49 let x = g(); |
| 24 assertEquals({value: 1, done: false}, x.next()); | 50 assertEquals({value: 1, done: false}, Next(x)); |
| 25 assertEquals({value: undefined, done: true}, x.next()); | 51 assertEquals({value: undefined, done: true}, Next(x)); |
| 26 assertThrowsEquals(() => x.throw("not caught"), "not caught"); | 52 assertThrowsEquals(() => Throw(x, "not caught"), "not caught"); |
| 27 } | 53 } |
| 28 } | 54 } |
| 29 | 55 |
| 30 | 56 |
| 31 { // return that doesn't close | 57 { // return that doesn't close |
| 32 let g = function*() { try {return 42} finally {yield 43} }; | 58 let g = function*() { try {return 42} finally {yield 43} }; |
| 33 | 59 |
| 34 { | 60 { |
| 35 let x = g(); | 61 let x = g(); |
| 36 assertEquals({value: 43, done: false}, x.next()); | 62 assertEquals({value: 43, done: false}, Next(x)); |
| 37 assertEquals({value: 42, done: true}, x.next()); | 63 assertEquals({value: 42, done: true}, Next(x)); |
| 38 } | 64 } |
| 39 } | 65 } |
| 40 | 66 |
| 41 | 67 |
| 42 { // return that doesn't close | 68 { // return that doesn't close |
| 43 let x; | 69 let x; |
| 44 let g = function*() { try {return 42} finally {x.throw(666)} }; | 70 let g = function*() { try {return 42} finally {Throw(x, 666)} }; |
| 45 | 71 |
| 46 { | 72 { |
| 47 x = g(); | 73 x = g(); |
| 48 assertThrows(() => x.next(), TypeError); // still executing | 74 assertThrows(() => Next(x), TypeError); // still executing |
| 49 } | 75 } |
| 50 } | 76 } |
| 51 | 77 |
| 52 | 78 |
| 53 { // yield in try-finally, finally clause performs return | 79 { // yield in try-finally, finally clause performs return |
| 54 | 80 |
| 55 let g = function*() { try {yield 42} finally {return 13} }; | 81 let g = function*() { try {yield 42} finally {return 13} }; |
| 56 | 82 |
| 57 { // "return" closes at suspendedStart | 83 { // "return" closes at suspendedStart |
| 58 let x = g(); | 84 let x = g(); |
| 59 assertEquals({value: 666, done: true}, x.return(666)); | 85 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 60 assertEquals({value: undefined, done: true}, x.next(42)); | 86 assertEquals({value: undefined, done: true}, Next(x, 42)); |
| 61 assertThrowsEquals(() => x.throw(43), 43); | 87 assertThrowsEquals(() => Throw(x, 43), 43); |
| 62 assertEquals({value: 42, done: true}, x.return(42)); | 88 assertEquals({value: 42, done: true}, Return(x, 42)); |
| 63 } | 89 } |
| 64 | 90 |
| 65 { // "throw" closes at suspendedStart | 91 { // "throw" closes at suspendedStart |
| 66 let x = g(); | 92 let x = g(); |
| 67 assertThrowsEquals(() => x.throw(666), 666); | 93 assertThrowsEquals(() => Throw(x, 666), 666); |
| 68 assertEquals({value: undefined, done: true}, x.next(42)); | 94 assertEquals({value: undefined, done: true}, Next(x, 42)); |
| 69 assertEquals({value: 43, done: true}, x.return(43)); | 95 assertEquals({value: 43, done: true}, Return(x, 43)); |
| 70 assertThrowsEquals(() => x.throw(44), 44); | 96 assertThrowsEquals(() => Throw(x, 44), 44); |
| 71 } | 97 } |
| 72 | 98 |
| 73 { // "next" closes at suspendedYield | 99 { // "next" closes at suspendedYield |
| 74 let x = g(); | 100 let x = g(); |
| 75 assertEquals({value: 42, done: false}, x.next()); | 101 assertEquals({value: 42, done: false}, Next(x)); |
| 76 assertEquals({value: 13, done: true}, x.next(666)); | 102 assertEquals({value: 13, done: true}, Next(x, 666)); |
| 77 assertEquals({value: undefined, done: true}, x.next(666)); | 103 assertEquals({value: undefined, done: true}, Next(x, 666)); |
| 78 assertThrowsEquals(() => x.throw(666), 666); | 104 assertThrowsEquals(() => Throw(x, 666), 666); |
| 79 } | 105 } |
| 80 | 106 |
| 81 { // "return" closes at suspendedYield | 107 { // "return" closes at suspendedYield |
| 82 let x = g(); | 108 let x = g(); |
| 83 assertEquals({value: 42, done: false}, x.next()); | 109 assertEquals({value: 42, done: false}, Next(x)); |
| 84 assertEquals({value: 13, done: true}, x.return(666)); | 110 assertEquals({value: 13, done: true}, Return(x, 666)); |
| 85 assertEquals({value: undefined, done: true}, x.next(666)); | 111 assertEquals({value: undefined, done: true}, Next(x, 666)); |
| 86 assertEquals({value: 666, done: true}, x.return(666)); | 112 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 87 } | 113 } |
| 88 | 114 |
| 89 { // "throw" closes at suspendedYield | 115 { // "throw" closes at suspendedYield |
| 90 let x = g(); | 116 let x = g(); |
| 91 assertEquals({value: 42, done: false}, x.next()); | 117 assertEquals({value: 42, done: false}, Next(x)); |
| 92 assertEquals({value: 13, done: true}, x.throw(666)); | 118 assertEquals({value: 13, done: true}, Throw(x, 666)); |
| 93 assertThrowsEquals(() => x.throw(666), 666); | 119 assertThrowsEquals(() => Throw(x, 666), 666); |
| 94 assertEquals({value: undefined, done: true}, x.next(666)); | 120 assertEquals({value: undefined, done: true}, Next(x, 666)); |
| 95 } | 121 } |
| 96 } | 122 } |
| 97 | 123 |
| 98 | 124 |
| 99 { // yield in try-finally, finally clause doesn't perform return | 125 { // yield in try-finally, finally clause doesn't perform return |
| 100 | 126 |
| 101 let g = function*() { try {yield 42} finally {13} }; | 127 let g = function*() { try {yield 42} finally {13} }; |
| 102 | 128 |
| 103 { // "return" closes at suspendedStart | 129 { // "return" closes at suspendedStart |
| 104 let x = g(); | 130 let x = g(); |
| 105 assertEquals({value: 666, done: true}, x.return(666)); | 131 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 106 assertEquals({value: undefined, done: true}, x.next(42)); | 132 assertEquals({value: undefined, done: true}, Next(x, 42)); |
| 107 assertThrowsEquals(() => x.throw(43), 43); | 133 assertThrowsEquals(() => Throw(x, 43), 43); |
| 108 assertEquals({value: 42, done: true}, x.return(42)); | 134 assertEquals({value: 42, done: true}, Return(x, 42)); |
| 109 } | 135 } |
| 110 | 136 |
| 111 { // "throw" closes at suspendedStart | 137 { // "throw" closes at suspendedStart |
| 112 let x = g(); | 138 let x = g(); |
| 113 assertThrowsEquals(() => x.throw(666), 666); | 139 assertThrowsEquals(() => Throw(x, 666), 666); |
| 114 assertEquals({value: undefined, done: true}, x.next(42)); | 140 assertEquals({value: undefined, done: true}, Next(x, 42)); |
| 115 assertEquals({value: 43, done: true}, x.return(43)); | 141 assertEquals({value: 43, done: true}, Return(x, 43)); |
| 116 assertThrowsEquals(() => x.throw(44), 44); | 142 assertThrowsEquals(() => Throw(x, 44), 44); |
| 117 } | 143 } |
| 118 | 144 |
| 119 { // "next" closes at suspendedYield | 145 { // "next" closes at suspendedYield |
| 120 let x = g(); | 146 let x = g(); |
| 121 assertEquals({value: 42, done: false}, x.next()); | 147 assertEquals({value: 42, done: false}, Next(x)); |
| 122 assertEquals({value: undefined, done: true}, x.next(666)); | 148 assertEquals({value: undefined, done: true}, Next(x, 666)); |
| 123 assertEquals({value: undefined, done: true}, x.next(666)); | 149 assertEquals({value: undefined, done: true}, Next(x, 666)); |
| 124 assertThrowsEquals(() => x.throw(666), 666); | 150 assertThrowsEquals(() => Throw(x, 666), 666); |
| 125 assertEquals({value: 42, done: true}, x.return(42)); | 151 assertEquals({value: 42, done: true}, Return(x, 42)); |
| 126 } | 152 } |
| 127 | 153 |
| 128 { // "return" closes at suspendedYield | 154 { // "return" closes at suspendedYield |
| 129 let x = g(); | 155 let x = g(); |
| 130 assertEquals({value: 42, done: false}, x.next()); | 156 assertEquals({value: 42, done: false}, Next(x)); |
| 131 assertEquals({value: 666, done: true}, x.return(666)); | 157 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 132 assertEquals({value: undefined, done: true}, x.next(666)); | 158 assertEquals({value: undefined, done: true}, Next(x, 666)); |
| 133 assertThrowsEquals(() => x.throw(44), 44); | 159 assertThrowsEquals(() => Throw(x, 44), 44); |
| 134 assertEquals({value: 42, done: true}, x.return(42)); | 160 assertEquals({value: 42, done: true}, Return(x, 42)); |
| 135 } | 161 } |
| 136 | 162 |
| 137 { // "throw" closes at suspendedYield | 163 { // "throw" closes at suspendedYield |
| 138 let x = g(); | 164 let x = g(); |
| 139 assertEquals({value: 42, done: false}, x.next()); | 165 assertEquals({value: 42, done: false}, Next(x)); |
| 140 assertThrowsEquals(() => x.throw(666), 666); | 166 assertThrowsEquals(() => Throw(x, 666), 666); |
| 141 assertEquals({value: undefined, done: true}, x.next(666)); | 167 assertEquals({value: undefined, done: true}, Next(x, 666)); |
| 142 assertThrowsEquals(() => x.throw(666), 666); | 168 assertThrowsEquals(() => Throw(x, 666), 666); |
| 143 assertEquals({value: 42, done: true}, x.return(42)); | 169 assertEquals({value: 42, done: true}, Return(x, 42)); |
| 144 } | 170 } |
| 145 } | 171 } |
| 146 | 172 |
| 147 | 173 |
| 148 { // yield in try-finally, finally clause yields and performs return | 174 { // yield in try-finally, finally clause yields and performs return |
| 149 | 175 |
| 150 let g = function*() { try {yield 42} finally {yield 43; return 13} }; | 176 let g = function*() { try {yield 42} finally {yield 43; return 13} }; |
| 151 | 177 |
| 152 { | 178 { |
| 153 let x = g(); | 179 let x = g(); |
| 154 assertEquals({value: 42, done: false}, x.next()); | 180 assertEquals({value: 42, done: false}, Next(x)); |
| 155 assertEquals({value: 43, done: false}, x.return(666)); | 181 assertEquals({value: 43, done: false}, Return(x, 666)); |
| 156 assertEquals({value: 13, done: true}, x.next()); | 182 assertEquals({value: 13, done: true}, Next(x)); |
| 157 assertEquals({value: 666, done: true}, x.return(666)); | 183 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 158 } | 184 } |
| 159 | 185 |
| 160 { | 186 { |
| 161 let x = g(); | 187 let x = g(); |
| 162 assertEquals({value: 666, done: true}, x.return(666)); | 188 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 163 assertEquals({value: undefined, done: true}, x.next()); | 189 assertEquals({value: undefined, done: true}, Next(x)); |
| 164 assertEquals({value: 666, done: true}, x.return(666)); | 190 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 165 } | 191 } |
| 166 } | 192 } |
| 167 | 193 |
| 168 | 194 |
| 169 { // yield in try-finally, finally clause yields and doesn't perform return | 195 { // yield in try-finally, finally clause yields and doesn't perform return |
| 170 | 196 |
| 171 let g = function*() { try {yield 42} finally {yield 43; 13} }; | 197 let g = function*() { try {yield 42} finally {yield 43; 13} }; |
| 172 | 198 |
| 173 { | 199 { |
| 174 let x = g(); | 200 let x = g(); |
| 175 assertEquals({value: 42, done: false}, x.next()); | 201 assertEquals({value: 42, done: false}, Next(x)); |
| 176 assertEquals({value: 43, done: false}, x.return(666)); | 202 assertEquals({value: 43, done: false}, Return(x, 666)); |
| 177 assertEquals({value: 666, done: true}, x.next()); | 203 assertEquals({value: 666, done: true}, Next(x)); |
| 178 assertEquals({value: 5, done: true}, x.return(5)); | 204 assertEquals({value: 5, done: true}, Return(x, 5)); |
| 179 } | 205 } |
| 180 | 206 |
| 181 { | 207 { |
| 182 let x = g(); | 208 let x = g(); |
| 183 assertEquals({value: 666, done: true}, x.return(666)); | 209 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 184 assertEquals({value: undefined, done: true}, x.next()); | 210 assertEquals({value: undefined, done: true}, Next(x)); |
| 185 assertEquals({value: 666, done: true}, x.return(666)); | 211 assertEquals({value: 666, done: true}, Return(x, 666)); |
| 186 } | 212 } |
| 187 } | 213 } |
| 188 | 214 |
| 189 | 215 |
| 190 { // yield*, finally clause performs return | 216 { // yield*, finally clause performs return |
| 191 | 217 |
| 192 let h = function*() { try {yield 42} finally {yield 43; return 13} }; | 218 let h = function*() { try {yield 42} finally {yield 43; return 13} }; |
| 193 let g = function*() { yield 1; yield yield* h(); }; | 219 let g = function*() { yield 1; yield yield* h(); }; |
| 194 | 220 |
| 195 { | 221 { |
| 196 let x = g(); | 222 let x = g(); |
| 197 assertEquals({value: 1, done: false}, x.next()); | 223 assertEquals({value: 1, done: false}, Next(x)); |
| 198 assertEquals({value: 42, done: false}, x.next()); | 224 assertEquals({value: 42, done: false}, Next(x)); |
| 199 assertEquals({value: 43, done: false}, x.next(666)); | 225 assertEquals({value: 43, done: false}, Next(x, 666)); |
| 200 assertEquals({value: 13, done: false}, x.next()); | 226 assertEquals({value: 13, done: false}, Next(x)); |
| 201 assertEquals({value: undefined, done: true}, x.next()); | 227 assertEquals({value: undefined, done: true}, Next(x)); |
| 202 } | 228 } |
| 203 | 229 |
| 204 { | 230 { |
| 205 let x = g(); | 231 let x = g(); |
| 206 assertEquals({value: 1, done: false}, x.next()); | 232 assertEquals({value: 1, done: false}, Next(x)); |
| 207 assertEquals({value: 42, done: false}, x.next()); | 233 assertEquals({value: 42, done: false}, Next(x)); |
| 208 assertEquals({value: 43, done: false}, x.return(666)); | 234 assertEquals({value: 43, done: false}, Return(x, 666)); |
| 209 assertEquals({value: 13, done: false}, x.next()); | 235 assertEquals({value: 13, done: false}, Next(x)); |
| 210 assertEquals({value: undefined, done: true}, x.next()); | 236 assertEquals({value: undefined, done: true}, Next(x)); |
| 211 } | 237 } |
| 212 | 238 |
| 213 { | 239 { |
| 214 let x = g(); | 240 let x = g(); |
| 215 assertEquals({value: 1, done: false}, x.next()); | 241 assertEquals({value: 1, done: false}, Next(x)); |
| 216 assertEquals({value: 42, done: false}, x.next()); | 242 assertEquals({value: 42, done: false}, Next(x)); |
| 217 assertEquals({value: 43, done: false}, x.throw(666)); | 243 assertEquals({value: 43, done: false}, Throw(x, 666)); |
| 218 assertEquals({value: 13, done: false}, x.next()); | 244 assertEquals({value: 13, done: false}, Next(x)); |
| 219 assertEquals({value: undefined, done: true}, x.next()); | 245 assertEquals({value: undefined, done: true}, Next(x)); |
| 220 } | 246 } |
| 221 } | 247 } |
| 222 | 248 |
| 223 | 249 |
| 224 { // yield*, finally clause does not perform return | 250 { // yield*, finally clause does not perform return |
| 225 | 251 |
| 226 let h = function*() { try {yield 42} finally {yield 43; 13} }; | 252 let h = function*() { try {yield 42} finally {yield 43; 13} }; |
| 227 let g = function*() { yield 1; yield yield* h(); }; | 253 let g = function*() { yield 1; yield yield* h(); }; |
| 228 | 254 |
| 229 { | 255 { |
| 230 let x = g(); | 256 let x = g(); |
| 231 assertEquals({value: 1, done: false}, x.next()); | 257 assertEquals({value: 1, done: false}, Next(x)); |
| 232 assertEquals({value: 42, done: false}, x.next()); | 258 assertEquals({value: 42, done: false}, Next(x)); |
| 233 assertEquals({value: 43, done: false}, x.next(666)); | 259 assertEquals({value: 43, done: false}, Next(x, 666)); |
| 234 assertEquals({value: undefined, done: false}, x.next()); | 260 assertEquals({value: undefined, done: false}, Next(x)); |
| 235 assertEquals({value: undefined, done: true}, x.next()); | 261 assertEquals({value: undefined, done: true}, Next(x)); |
| 236 } | 262 } |
| 237 | 263 |
| 238 { | 264 { |
| 239 let x = g(); | 265 let x = g(); |
| 240 assertEquals({value: 1, done: false}, x.next()); | 266 assertEquals({value: 1, done: false}, Next(x)); |
| 241 assertEquals({value: 42, done: false}, x.next()); | 267 assertEquals({value: 42, done: false}, Next(x)); |
| 242 assertEquals({value: 43, done: false}, x.return(44)); | 268 assertEquals({value: 43, done: false}, Return(x, 44)); |
| 243 assertEquals({value: 44, done: false}, x.next()); | 269 assertEquals({value: 44, done: false}, Next(x)); |
| 244 assertEquals({value: undefined, done: true}, x.next()); | 270 assertEquals({value: undefined, done: true}, Next(x)); |
| 245 } | 271 } |
| 246 | 272 |
| 247 { | 273 { |
| 248 let x = g(); | 274 let x = g(); |
| 249 assertEquals({value: 1, done: false}, x.next()); | 275 assertEquals({value: 1, done: false}, Next(x)); |
| 250 assertEquals({value: 42, done: false}, x.next()); | 276 assertEquals({value: 42, done: false}, Next(x)); |
| 251 assertEquals({value: 43, done: false}, x.throw(666)); | 277 assertEquals({value: 43, done: false}, Throw(x, 666)); |
| 252 assertThrowsEquals(() => x.next(), 666); | 278 assertThrowsEquals(() => Next(x), 666); |
| 253 } | 279 } |
| 254 } | 280 } |
| 255 | 281 |
| 256 | 282 |
| 257 { // yield*, .return argument is final result | 283 { // yield*, .return argument is final result |
| 258 | 284 |
| 259 function* inner() { | 285 function* inner() { |
| 260 yield 2; | 286 yield 2; |
| 261 } | 287 } |
| 262 | 288 |
| 263 function* g() { | 289 function* g() { |
| 264 yield 1; | 290 yield 1; |
| 265 return yield* inner(); | 291 return yield* inner(); |
| 266 } | 292 } |
| 267 | 293 |
| 268 { | 294 { |
| 269 let x = g(); | 295 let x = g(); |
| 270 assertEquals({value: 1, done: false}, x.next()); | 296 assertEquals({value: 1, done: false}, Next(x)); |
| 271 assertEquals({value: 2, done: false}, x.next()); | 297 assertEquals({value: 2, done: false}, Next(x)); |
| 272 assertEquals({value: 42, done: true}, x.return(42)); | 298 assertEquals({value: 42, done: true}, Return(x, 42)); |
| 273 } | 299 } |
| 274 } | 300 } |
| 275 | 301 |
| 276 | 302 |
| 277 // More or less random tests from here on. | 303 // More or less random tests from here on. |
| 278 | 304 |
| 279 | 305 |
| 280 { | 306 { |
| 281 function* foo() { } | 307 function* foo() { } |
| 282 let g = foo(); | 308 let g = foo(); |
| 283 assertEquals({value: undefined, done: true}, g.next()); | 309 assertEquals({value: undefined, done: true}, Next(g)); |
| 284 assertEquals({value: undefined, done: true}, g.next()); | 310 assertEquals({value: undefined, done: true}, Next(g)); |
| 285 } | 311 } |
| 286 | 312 |
| 287 { | 313 { |
| 288 function* foo() { return new.target } | 314 function* foo() { return new.target } |
| 289 let g = foo(); | 315 let g = foo(); |
| 290 assertEquals({value: undefined, done: true}, g.next()); | 316 assertEquals({value: undefined, done: true}, Next(g)); |
| 291 assertEquals({value: undefined, done: true}, g.next()); | 317 assertEquals({value: undefined, done: true}, Next(g)); |
| 292 } | 318 } |
| 293 | 319 |
| 294 { | 320 { |
| 295 function* foo() { throw 666; return 42} | 321 function* foo() { throw 666; return 42} |
| 296 let g = foo(); | 322 let g = foo(); |
| 297 assertThrowsEquals(() => g.next(), 666); | 323 assertThrowsEquals(() => Next(g), 666); |
| 298 assertEquals({value: undefined, done: true}, g.next()); | 324 assertEquals({value: undefined, done: true}, Next(g)); |
| 299 } | 325 } |
| 300 | 326 |
| 301 { | 327 { |
| 302 function* foo(a) { return a; } | 328 function* foo(a) { return a; } |
| 303 let g = foo(42); | 329 let g = foo(42); |
| 304 assertEquals({value: 42, done: true}, g.next()); | 330 assertEquals({value: 42, done: true}, Next(g)); |
| 305 assertEquals({value: undefined, done: true}, g.next()); | 331 assertEquals({value: undefined, done: true}, Next(g)); |
| 306 } | 332 } |
| 307 | 333 |
| 308 { | 334 { |
| 309 function* foo(a) { a.iwashere = true; return a; } | 335 function* foo(a) { a.iwashere = true; return a; } |
| 310 let x = {}; | 336 let x = {}; |
| 311 let g = foo(x); | 337 let g = foo(x); |
| 312 assertEquals({value: {iwashere: true}, done: true}, g.next()); | 338 assertEquals({value: {iwashere: true}, done: true}, Next(g)); |
| 313 assertEquals({value: undefined, done: true}, g.next()); | 339 assertEquals({value: undefined, done: true}, Next(g)); |
| 314 } | 340 } |
| 315 | 341 |
| 316 { | 342 { |
| 317 let a = 42; | 343 let a = 42; |
| 318 function* foo() { return a; } | 344 function* foo() { return a; } |
| 319 let g = foo(); | 345 let g = foo(); |
| 320 assertEquals({value: 42, done: true}, g.next()); | 346 assertEquals({value: 42, done: true}, Next(g)); |
| 321 assertEquals({value: undefined, done: true}, g.next()); | 347 assertEquals({value: undefined, done: true}, Next(g)); |
| 322 } | 348 } |
| 323 | 349 |
| 324 { | 350 { |
| 325 let a = 40; | 351 let a = 40; |
| 326 function* foo(b) { return a + b; } | 352 function* foo(b) { return a + b; } |
| 327 let g = foo(2); | 353 let g = foo(2); |
| 328 assertEquals({value: 42, done: true}, g.next()); | 354 assertEquals({value: 42, done: true}, Next(g)); |
| 329 assertEquals({value: undefined, done: true}, g.next()); | 355 assertEquals({value: undefined, done: true}, Next(g)); |
| 330 } | 356 } |
| 331 | 357 |
| 332 { | 358 { |
| 333 let a = 40; | 359 let a = 40; |
| 334 function* foo(b) { a--; b++; return a + b; } | 360 function* foo(b) { a--; b++; return a + b; } |
| 335 let g = foo(2); | 361 let g = foo(2); |
| 336 assertEquals({value: 42, done: true}, g.next()); | 362 assertEquals({value: 42, done: true}, Next(g)); |
| 337 assertEquals({value: undefined, done: true}, g.next()); | 363 assertEquals({value: undefined, done: true}, Next(g)); |
| 338 } | 364 } |
| 339 | 365 |
| 340 { | 366 { |
| 341 let g; | 367 let g; |
| 342 function* foo() { g.next() } | 368 function* foo() { Next(g) } |
| 343 g = foo(); | 369 g = foo(); |
| 344 assertThrows(() => g.next(), TypeError); | 370 assertThrows(() => Next(g), TypeError); |
| 345 assertEquals({value: undefined, done: true}, g.next()); | 371 assertEquals({value: undefined, done: true}, Next(g)); |
| 346 } | 372 } |
| 347 | 373 |
| 348 { | 374 { |
| 349 function* foo() { yield 2; yield 3; yield 4 } | 375 function* foo() { yield 2; yield 3; yield 4 } |
| 350 g = foo(); | 376 g = foo(); |
| 351 assertEquals({value: 2, done: false}, g.next()); | 377 assertEquals({value: 2, done: false}, Next(g)); |
| 352 assertEquals({value: 3, done: false}, g.next()); | 378 assertEquals({value: 3, done: false}, Next(g)); |
| 353 assertEquals({value: 4, done: false}, g.next()); | 379 assertEquals({value: 4, done: false}, Next(g)); |
| 354 assertEquals({value: undefined, done: true}, g.next()); | 380 assertEquals({value: undefined, done: true}, Next(g)); |
| 355 assertEquals({value: undefined, done: true}, g.next()); | 381 assertEquals({value: undefined, done: true}, Next(g)); |
| 356 } | 382 } |
| 357 | 383 |
| 384 | |
| 358 { | 385 { |
| 359 function* foo() { yield 2; if (true) { yield 3 }; yield 4 } | 386 function* foo() { yield 2; if (true) { yield 3 }; yield 4 } |
| 360 g = foo(); | 387 g = foo(); |
| 361 assertEquals({value: 2, done: false}, g.next()); | 388 assertEquals({value: 2, done: false}, Next(g)); |
| 362 assertEquals({value: 3, done: false}, g.next()); | 389 assertEquals({value: 3, done: false}, Next(g)); |
| 363 assertEquals({value: 4, done: false}, g.next()); | 390 assertEquals({value: 4, done: false}, Next(g)); |
| 364 assertEquals({value: undefined, done: true}, g.next()); | 391 assertEquals({value: undefined, done: true}, Next(g)); |
| 365 assertEquals({value: undefined, done: true}, g.next()); | 392 assertEquals({value: undefined, done: true}, Next(g)); |
| 366 } | 393 } |
| 367 | 394 |
| 368 { | 395 { |
| 369 function* foo() { yield 2; if (true) { yield 3; yield 4 } } | 396 function* foo() { yield 2; if (true) { yield 3; yield 4 } } |
| 370 g = foo(); | 397 g = foo(); |
| 371 assertEquals({value: 2, done: false}, g.next()); | 398 assertEquals({value: 2, done: false}, Next(g)); |
| 372 assertEquals({value: 3, done: false}, g.next()); | 399 assertEquals({value: 3, done: false}, Next(g)); |
| 373 assertEquals({value: 4, done: false}, g.next()); | 400 assertEquals({value: 4, done: false}, Next(g)); |
| 374 assertEquals({value: undefined, done: true}, g.next()); | 401 assertEquals({value: undefined, done: true}, Next(g)); |
| 375 assertEquals({value: undefined, done: true}, g.next()); | 402 assertEquals({value: undefined, done: true}, Next(g)); |
| 376 } | 403 } |
| 377 | 404 |
| 378 { | 405 { |
| 379 function* foo() { yield 2; if (false) { yield 3 }; yield 4 } | 406 function* foo() { yield 2; if (false) { yield 3 }; yield 4 } |
| 380 g = foo(); | 407 g = foo(); |
| 381 assertEquals({value: 2, done: false}, g.next()); | 408 assertEquals({value: 2, done: false}, Next(g)); |
| 382 assertEquals({value: 4, done: false}, g.next()); | 409 assertEquals({value: 4, done: false}, Next(g)); |
| 383 assertEquals({value: undefined, done: true}, g.next()); | 410 assertEquals({value: undefined, done: true}, Next(g)); |
| 384 assertEquals({value: undefined, done: true}, g.next()); | 411 assertEquals({value: undefined, done: true}, Next(g)); |
| 385 } | 412 } |
| 386 | 413 |
| 387 { | 414 { |
| 388 function* foo() { yield 2; while (true) { yield 3 }; yield 4 } | 415 function* foo() { yield 2; while (true) { yield 3 }; yield 4 } |
| 389 g = foo(); | 416 g = foo(); |
| 390 assertEquals({value: 2, done: false}, g.next()); | 417 assertEquals({value: 2, done: false}, Next(g)); |
| 391 assertEquals({value: 3, done: false}, g.next()); | 418 assertEquals({value: 3, done: false}, Next(g)); |
| 392 assertEquals({value: 3, done: false}, g.next()); | 419 assertEquals({value: 3, done: false}, Next(g)); |
| 393 assertEquals({value: 3, done: false}, g.next()); | 420 assertEquals({value: 3, done: false}, Next(g)); |
| 394 assertEquals({value: 3, done: false}, g.next()); | 421 assertEquals({value: 3, done: false}, Next(g)); |
| 395 } | 422 } |
| 396 | 423 |
| 397 { | 424 { |
| 398 function* foo() { yield 2; (yield 3) + 42; yield 4 } | 425 function* foo() { yield 2; (yield 3) + 42; yield 4 } |
| 399 g = foo(); | 426 g = foo(); |
| 400 assertEquals({value: 2, done: false}, g.next()); | 427 assertEquals({value: 2, done: false}, Next(g)); |
| 401 assertEquals({value: 3, done: false}, g.next()); | 428 assertEquals({value: 3, done: false}, Next(g)); |
| 402 assertEquals({value: 4, done: false}, g.next()); | 429 assertEquals({value: 4, done: false}, Next(g)); |
| 403 } | 430 } |
| 404 | 431 |
| 405 { | 432 { |
| 406 function* foo() { yield 2; (do {yield 3}) + 42; yield 4 } | 433 function* foo() { yield 2; (do {yield 3}) + 42; yield 4 } |
| 407 g = foo(); | 434 g = foo(); |
| 408 assertEquals({value: 2, done: false}, g.next()); | 435 assertEquals({value: 2, done: false}, Next(g)); |
| 409 assertEquals({value: 3, done: false}, g.next()); | 436 assertEquals({value: 3, done: false}, Next(g)); |
| 410 assertEquals({value: 4, done: false}, g.next()); | 437 assertEquals({value: 4, done: false}, Next(g)); |
| 411 } | 438 } |
| 412 | 439 |
| 413 { | 440 { |
| 414 function* foo() { yield 2; return (yield 3) + 42; yield 4 } | 441 function* foo() { yield 2; return (yield 3) + 42; yield 4 } |
| 415 g = foo(); | 442 g = foo(); |
| 416 assertEquals({value: 2, done: false}, g.next()); | 443 assertEquals({value: 2, done: false}, Next(g)); |
| 417 assertEquals({value: 3, done: false}, g.next()); | 444 assertEquals({value: 3, done: false}, Next(g)); |
| 418 assertEquals({value: 42, done: true}, g.next(0)); | 445 assertEquals({value: 42, done: true}, Next(g, 0)); |
| 419 assertEquals({value: undefined, done: true}, g.next()); | 446 assertEquals({value: undefined, done: true}, Next(g)); |
| 420 } | 447 } |
| 421 | 448 |
| 422 { | 449 { |
| 423 let x = 42; | 450 let x = 42; |
| 424 function* foo() { | 451 function* foo() { |
| 425 yield x; | 452 yield x; |
| 426 for (let x in {a: 1, b: 2}) { | 453 for (let x in {a: 1, b: 2}) { |
| 427 let i = 2; | 454 let i = 2; |
| 428 yield x; | 455 yield x; |
| 429 yield i; | 456 yield i; |
| 430 do { | 457 do { |
| 431 yield i; | 458 yield i; |
| 432 } while (i-- > 0); | 459 } while (i-- > 0); |
| 433 } | 460 } |
| 434 yield x; | 461 yield x; |
| 435 return 5; | 462 return 5; |
| 436 } | 463 } |
| 437 g = foo(); | 464 g = foo(); |
| 438 assertEquals({value: 42, done: false}, g.next()); | 465 assertEquals({value: 42, done: false}, Next(g)); |
| 439 assertEquals({value: 'a', done: false}, g.next()); | 466 assertEquals({value: 'a', done: false}, Next(g)); |
| 440 assertEquals({value: 2, done: false}, g.next()); | 467 assertEquals({value: 2, done: false}, Next(g)); |
| 441 assertEquals({value: 2, done: false}, g.next()); | 468 assertEquals({value: 2, done: false}, Next(g)); |
| 442 assertEquals({value: 1, done: false}, g.next()); | 469 assertEquals({value: 1, done: false}, Next(g)); |
| 443 assertEquals({value: 0, done: false}, g.next()); | 470 assertEquals({value: 0, done: false}, Next(g)); |
| 444 assertEquals({value: 'b', done: false}, g.next()); | 471 assertEquals({value: 'b', done: false}, Next(g)); |
| 445 assertEquals({value: 2, done: false}, g.next()); | 472 assertEquals({value: 2, done: false}, Next(g)); |
| 446 assertEquals({value: 2, done: false}, g.next()); | 473 assertEquals({value: 2, done: false}, Next(g)); |
| 447 assertEquals({value: 1, done: false}, g.next()); | 474 assertEquals({value: 1, done: false}, Next(g)); |
| 448 assertEquals({value: 0, done: false}, g.next()); | 475 assertEquals({value: 0, done: false}, Next(g)); |
| 449 assertEquals({value: 42, done: false}, g.next()); | 476 assertEquals({value: 42, done: false}, Next(g)); |
| 450 assertEquals({value: 5, done: true}, g.next()); | 477 assertEquals({value: 5, done: true}, Next(g)); |
| 451 } | 478 } |
| 452 | 479 |
| 453 { | 480 { |
| 454 let a = 3; | 481 let a = 3; |
| 455 function* foo() { | 482 function* foo() { |
| 456 let b = 4; | 483 let b = 4; |
| 457 yield 1; | 484 yield 1; |
| 458 { let c = 5; yield 2; yield a; yield b; yield c; } | 485 { let c = 5; yield 2; yield a; yield b; yield c; } |
| 459 } | 486 } |
| 460 g = foo(); | 487 g = foo(); |
| 461 assertEquals({value: 1, done: false}, g.next()); | 488 assertEquals({value: 1, done: false}, Next(g)); |
| 462 assertEquals({value: 2, done: false}, g.next()); | 489 assertEquals({value: 2, done: false}, Next(g)); |
| 463 assertEquals({value: 3, done: false}, g.next()); | 490 assertEquals({value: 3, done: false}, Next(g)); |
| 464 assertEquals({value: 4, done: false}, g.next()); | 491 assertEquals({value: 4, done: false}, Next(g)); |
| 465 assertEquals({value: 5, done: false}, g.next()); | 492 assertEquals({value: 5, done: false}, Next(g)); |
| 466 assertEquals({value: undefined, done: true}, g.next()); | 493 assertEquals({value: undefined, done: true}, Next(g)); |
| 467 } | 494 } |
| 468 | 495 |
| 469 { | 496 { |
| 470 function* foo() { | 497 function* foo() { |
| 471 yield 42; | 498 yield 42; |
| 472 yield 42; | 499 yield 42; |
| 473 yield 42; | 500 yield 42; |
| 474 yield 42; | 501 yield 42; |
| 475 yield 42; | 502 yield 42; |
| 476 yield 42; | 503 yield 42; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 564 yield 42; | 591 yield 42; |
| 565 yield 42; | 592 yield 42; |
| 566 yield 42; | 593 yield 42; |
| 567 yield 42; | 594 yield 42; |
| 568 yield 42; | 595 yield 42; |
| 569 yield 42; | 596 yield 42; |
| 570 yield 42; | 597 yield 42; |
| 571 } | 598 } |
| 572 g = foo(); | 599 g = foo(); |
| 573 for (let i = 0; i < 100; ++i) { | 600 for (let i = 0; i < 100; ++i) { |
| 574 assertEquals({value: 42, done: false}, g.next()); | 601 assertEquals({value: 42, done: false}, i%25 === 0 ? Next(g) : g.next()); |
| 575 } | 602 } |
| 576 assertEquals({value: undefined, done: true}, g.next()); | 603 assertEquals({value: undefined, done: true}, Next(g)); |
| 577 } | 604 } |
| 578 | 605 |
| 579 { | 606 { |
| 580 function* foo() { | 607 function* foo() { |
| 581 for (let i = 0; i < 3; ++i) { | 608 for (let i = 0; i < 3; ++i) { |
| 582 let j = 0 | 609 let j = 0 |
| 583 yield i; | 610 yield i; |
| 584 do { | 611 do { |
| 585 yield (i + 10); | 612 yield (i + 10); |
| 586 } while (++j < 2); | 613 } while (++j < 2); |
| 587 } | 614 } |
| 588 } | 615 } |
| 589 g = foo(); | 616 g = foo(); |
| 590 assertEquals({value: 0, done: false}, g.next()); | 617 assertEquals({value: 0, done: false}, Next(g)); |
| 591 assertEquals({value: 10, done: false}, g.next()); | 618 assertEquals({value: 10, done: false}, Next(g)); |
| 592 assertEquals({value: 10, done: false}, g.next()); | 619 assertEquals({value: 10, done: false}, Next(g)); |
| 593 assertEquals({value: 1, done: false}, g.next()); | 620 assertEquals({value: 1, done: false}, Next(g)); |
| 594 assertEquals({value: 11, done: false}, g.next()); | 621 assertEquals({value: 11, done: false}, Next(g)); |
| 595 assertEquals({value: 11, done: false}, g.next()); | 622 assertEquals({value: 11, done: false}, Next(g)); |
| 596 assertEquals({value: 2, done: false}, g.next()); | 623 assertEquals({value: 2, done: false}, Next(g)); |
| 597 assertEquals({value: 12, done: false}, g.next()); | 624 assertEquals({value: 12, done: false}, Next(g)); |
| 598 assertEquals({value: 12, done: false}, g.next()); | 625 assertEquals({value: 12, done: false}, Next(g)); |
| 599 assertEquals({value: undefined, done: true}, g.next()); | 626 assertEquals({value: undefined, done: true}, Next(g)); |
| 600 } | 627 } |
| 628 | |
| 629 { | |
| 630 let foo = function*() { | |
| 631 while (true) { | |
| 632 if (true || false) yield 42; | |
| 633 continue; | |
| 634 } | |
| 635 } | |
| 636 g = foo(); | |
| 637 assertEquals({value: 42, done: false}, Next(g)); | |
| 638 assertEquals({value: 42, done: false}, Next(g)); | |
| 639 assertEquals({value: 42, done: false}, Next(g)); | |
| 640 } | |
| OLD | NEW |