Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/generators.dart

Issue 3003613002: improve DDC's type checks (Closed)
Patch Set: format Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// This library adapts ES6 generators to implement Dart's async/await. 5 /// This library adapts ES6 generators to implement Dart's async/await.
6 /// It's designed to interact with Dart's Future/Stream and follow Dart 6 /// It's designed to interact with Dart's Future/Stream and follow Dart
7 /// async/await semantics. 7 /// async/await semantics.
8 /// See https://github.com/dart-lang/sdk/issues/27315 for ideas on 8 /// See https://github.com/dart-lang/sdk/issues/27315 for ideas on
9 /// reconciling Dart's Future and ES6 Promise. 9 /// reconciling Dart's Future and ES6 Promise.
10 /// Inspired by `co`: https://github.com/tj/co/blob/master/index.js, which is a 10 /// Inspired by `co`: https://github.com/tj/co/blob/master/index.js, which is a
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 if (this.isSuspendedAtYield || this.isAdding) return; 178 if (this.isSuspendedAtYield || this.isAdding) return;
179 179
180 // Handle `await`: if we get a value passed to `yield` it means we are 180 // Handle `await`: if we get a value passed to `yield` it means we are
181 // waiting on this Future. Make sure to prevent scheduling, and pass the 181 // waiting on this Future. Make sure to prevent scheduling, and pass the
182 // value back as the result of the `yield`. 182 // value back as the result of the `yield`.
183 // 183 //
184 // TODO(jmesserly): is the timing here correct? The assumption here is 184 // TODO(jmesserly): is the timing here correct? The assumption here is
185 // that we should schedule `await` in `async*` the same as in `async`. 185 // that we should schedule `await` in `async*` the same as in `async`.
186 this.isWaiting = true; 186 this.isWaiting = true;
187 let future = iter.value; 187 let future = iter.value;
188 if (!$instanceOf(future, ${getGenericClass(Future)})) { 188 // TODO(jmesserly): `async` uses a different check that looks for the
189 // (private) implementation type of `Future`, rather than the public type.
190 if (!$Future.is(future)) {
189 future = $Future.value(future); 191 future = $Future.value(future);
190 } 192 }
191 return future.then($dynamic)((x) => this.runBody(x), 193 return future.then($dynamic)((x) => this.runBody(x),
192 { onError: (e, s) => this.throwError(e, s) }); 194 { onError: (e, s) => this.throwError(e, s) });
193 } 195 }
194 196
195 // Adds element to stream, returns true if the caller should terminate 197 // Adds element to stream, returns true if the caller should terminate
196 // execution of the generator. 198 // execution of the generator.
197 add(event) { 199 add(event) {
198 // If stream is cancelled, tell caller to exit the async generator. 200 // If stream is cancelled, tell caller to exit the async generator.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 } 239 }
238 if (!this.controller.hasListener) return; 240 if (!this.controller.hasListener) return;
239 this.controller.addError(error, stackTrace); 241 this.controller.addError(error, stackTrace);
240 } 242 }
241 } 243 }
242 '''); 244 ''');
243 245
244 /// Returns a Stream of T implemented by an async* function. 246 /// Returns a Stream of T implemented by an async* function.
245 asyncStar(gen, T, @rest args) => JS('', 'new #(#, #, #).controller.stream', 247 asyncStar(gen, T, @rest args) => JS('', 'new #(#, #, #).controller.stream',
246 _AsyncStarStreamController, gen, T, args); 248 _AsyncStarStreamController, gen, T, args);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698