OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 (function(global, utils, extrasUtils) { | 5 (function(global, utils, extrasUtils) { |
6 | 6 |
7 "use strict"; | 7 "use strict"; |
8 | 8 |
9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
10 | 10 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 if (resolver === promiseRawSymbol) { | 64 if (resolver === promiseRawSymbol) { |
65 return %NewObject(GlobalPromise, new.target); | 65 return %NewObject(GlobalPromise, new.target); |
66 } | 66 } |
67 if (IS_UNDEFINED(new.target)) throw MakeTypeError(kNotAPromise, this); | 67 if (IS_UNDEFINED(new.target)) throw MakeTypeError(kNotAPromise, this); |
68 if (!IS_CALLABLE(resolver)) | 68 if (!IS_CALLABLE(resolver)) |
69 throw MakeTypeError(kResolverNotAFunction, resolver); | 69 throw MakeTypeError(kResolverNotAFunction, resolver); |
70 | 70 |
71 var promise = PromiseInit(%NewObject(GlobalPromise, new.target)); | 71 var promise = PromiseInit(%NewObject(GlobalPromise, new.target)); |
72 | 72 |
73 try { | 73 try { |
74 %DebugPushPromise(promise, Promise); | 74 %DebugPushPromise(promise, Promise, resolver); |
75 var callbacks = CreateResolvingFunctions(promise); | 75 var callbacks = CreateResolvingFunctions(promise); |
76 resolver(callbacks.resolve, callbacks.reject); | 76 resolver(callbacks.resolve, callbacks.reject); |
77 } catch (e) { | 77 } catch (e) { |
78 PromiseReject(promise, e); | 78 PromiseReject(promise, e); |
79 } finally { | 79 } finally { |
80 %DebugPopPromise(); | 80 %DebugPopPromise(); |
81 } | 81 } |
82 | 82 |
83 return promise; | 83 return promise; |
84 } | 84 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 deferred.reject(r); | 132 deferred.reject(r); |
133 } | 133 } |
134 return deferred.promise; | 134 return deferred.promise; |
135 } | 135 } |
136 } | 136 } |
137 return x; | 137 return x; |
138 } | 138 } |
139 | 139 |
140 function PromiseHandle(value, handler, deferred) { | 140 function PromiseHandle(value, handler, deferred) { |
141 try { | 141 try { |
142 %DebugPushPromise(deferred.promise, PromiseHandle); | 142 %DebugPushPromise(deferred.promise, PromiseHandle, handler); |
143 var result = handler(value); | 143 var result = handler(value); |
144 if (result === deferred.promise) | 144 if (result === deferred.promise) |
145 throw MakeTypeError(kPromiseCyclic, result); | 145 throw MakeTypeError(kPromiseCyclic, result); |
146 else if (IsPromise(result)) | 146 else if (IsPromise(result)) |
147 %_Call(PromiseChain, result, deferred.resolve, deferred.reject); | 147 %_Call(PromiseChain, result, deferred.resolve, deferred.reject); |
148 else | 148 else |
149 deferred.resolve(result); | 149 deferred.resolve(result); |
150 } catch (exception) { | 150 } catch (exception) { |
151 try { deferred.reject(exception); } catch (e) { } | 151 try { deferred.reject(exception); } catch (e) { } |
152 } finally { | 152 } finally { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 onReject = IS_CALLABLE(onReject) ? onReject : PromiseIdRejectHandler; | 333 onReject = IS_CALLABLE(onReject) ? onReject : PromiseIdRejectHandler; |
334 var that = this; | 334 var that = this; |
335 var constructor = this.constructor; | 335 var constructor = this.constructor; |
336 return %_Call( | 336 return %_Call( |
337 PromiseChainInternal, | 337 PromiseChainInternal, |
338 this, | 338 this, |
339 constructor, | 339 constructor, |
340 function(x) { | 340 function(x) { |
341 x = PromiseCoerce(constructor, x); | 341 x = PromiseCoerce(constructor, x); |
342 if (x === that) { | 342 if (x === that) { |
| 343 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onReject); |
343 return onReject(MakeTypeError(kPromiseCyclic, x)); | 344 return onReject(MakeTypeError(kPromiseCyclic, x)); |
344 } else if (IsPromise(x)) { | 345 } else if (IsPromise(x)) { |
345 return x.then(onResolve, onReject); | 346 return x.then(onResolve, onReject); |
346 } else { | 347 } else { |
| 348 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onResolve); |
347 return onResolve(x); | 349 return onResolve(x); |
348 } | 350 } |
349 }, | 351 }, |
350 onReject | 352 onReject |
351 ); | 353 ); |
352 } | 354 } |
353 | 355 |
354 // Combinators. | 356 // Combinators. |
355 | 357 |
356 function PromiseCast(x) { | 358 function PromiseCast(x) { |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 [PromiseChain, PromiseDeferred, PromiseResolved].forEach( | 479 [PromiseChain, PromiseDeferred, PromiseResolved].forEach( |
478 fn => %FunctionRemovePrototype(fn)); | 480 fn => %FunctionRemovePrototype(fn)); |
479 | 481 |
480 utils.Export(function(to) { | 482 utils.Export(function(to) { |
481 to.PromiseChain = PromiseChain; | 483 to.PromiseChain = PromiseChain; |
482 to.PromiseDeferred = PromiseDeferred; | 484 to.PromiseDeferred = PromiseDeferred; |
483 to.PromiseResolved = PromiseResolved; | 485 to.PromiseResolved = PromiseResolved; |
484 }); | 486 }); |
485 | 487 |
486 }) | 488 }) |
OLD | NEW |