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 var $promiseCreate; | 5 var $promiseCreate; |
6 var $promiseResolve; | 6 var $promiseResolve; |
7 var $promiseReject; | 7 var $promiseReject; |
8 var $promiseChain; | 8 var $promiseChain; |
9 var $promiseCatch; | 9 var $promiseCatch; |
10 var $promiseThen; | 10 var $promiseThen; |
(...skipping 13 matching lines...) Expand all Loading... |
24 var promiseStatus = GLOBAL_PRIVATE("Promise#status"); | 24 var promiseStatus = GLOBAL_PRIVATE("Promise#status"); |
25 var promiseValue = GLOBAL_PRIVATE("Promise#value"); | 25 var promiseValue = GLOBAL_PRIVATE("Promise#value"); |
26 var promiseOnResolve = GLOBAL_PRIVATE("Promise#onResolve"); | 26 var promiseOnResolve = GLOBAL_PRIVATE("Promise#onResolve"); |
27 var promiseOnReject = GLOBAL_PRIVATE("Promise#onReject"); | 27 var promiseOnReject = GLOBAL_PRIVATE("Promise#onReject"); |
28 var promiseRaw = GLOBAL_PRIVATE("Promise#raw"); | 28 var promiseRaw = GLOBAL_PRIVATE("Promise#raw"); |
29 var promiseHasHandler = %PromiseHasHandlerSymbol(); | 29 var promiseHasHandler = %PromiseHasHandlerSymbol(); |
30 var lastMicrotaskId = 0; | 30 var lastMicrotaskId = 0; |
31 | 31 |
32 var GlobalPromise = function Promise(resolver) { | 32 var GlobalPromise = function Promise(resolver) { |
33 if (resolver === promiseRaw) return; | 33 if (resolver === promiseRaw) return; |
34 if (!%_IsConstructCall()) throw MakeTypeError('not_a_promise', [this]); | 34 if (!%_IsConstructCall()) throw MakeTypeError(kNotAPromise, this); |
35 if (!IS_SPEC_FUNCTION(resolver)) | 35 if (!IS_SPEC_FUNCTION(resolver)) |
36 throw MakeTypeError('resolver_not_a_function', [resolver]); | 36 throw MakeTypeError(kResolverNotAFunction, resolver); |
37 var promise = PromiseInit(this); | 37 var promise = PromiseInit(this); |
38 try { | 38 try { |
39 %DebugPushPromise(promise, Promise); | 39 %DebugPushPromise(promise, Promise); |
40 resolver(function(x) { PromiseResolve(promise, x) }, | 40 resolver(function(x) { PromiseResolve(promise, x) }, |
41 function(r) { PromiseReject(promise, r) }); | 41 function(r) { PromiseReject(promise, r) }); |
42 } catch (e) { | 42 } catch (e) { |
43 PromiseReject(promise, e); | 43 PromiseReject(promise, e); |
44 } finally { | 44 } finally { |
45 %DebugPopPromise(); | 45 %DebugPopPromise(); |
46 } | 46 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 } | 99 } |
100 return x; | 100 return x; |
101 } | 101 } |
102 | 102 |
103 function PromiseHandle(value, handler, deferred) { | 103 function PromiseHandle(value, handler, deferred) { |
104 try { | 104 try { |
105 %DebugPushPromise(deferred.promise, PromiseHandle); | 105 %DebugPushPromise(deferred.promise, PromiseHandle); |
106 DEBUG_PREPARE_STEP_IN_IF_STEPPING(handler); | 106 DEBUG_PREPARE_STEP_IN_IF_STEPPING(handler); |
107 var result = handler(value); | 107 var result = handler(value); |
108 if (result === deferred.promise) | 108 if (result === deferred.promise) |
109 throw MakeTypeError('promise_cyclic', [result]); | 109 throw MakeTypeError(kPromiseCyclic, result); |
110 else if (IsPromise(result)) | 110 else if (IsPromise(result)) |
111 %_CallFunction(result, deferred.resolve, deferred.reject, PromiseChain); | 111 %_CallFunction(result, deferred.resolve, deferred.reject, PromiseChain); |
112 else | 112 else |
113 deferred.resolve(result); | 113 deferred.resolve(result); |
114 } catch (exception) { | 114 } catch (exception) { |
115 try { deferred.reject(exception); } catch (e) { } | 115 try { deferred.reject(exception); } catch (e) { } |
116 } finally { | 116 } finally { |
117 %DebugPopPromise(); | 117 %DebugPopPromise(); |
118 } | 118 } |
119 } | 119 } |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 } | 217 } |
218 | 218 |
219 // Simple chaining. | 219 // Simple chaining. |
220 | 220 |
221 function PromiseChain(onResolve, onReject) { // a.k.a. flatMap | 221 function PromiseChain(onResolve, onReject) { // a.k.a. flatMap |
222 onResolve = IS_UNDEFINED(onResolve) ? PromiseIdResolveHandler : onResolve; | 222 onResolve = IS_UNDEFINED(onResolve) ? PromiseIdResolveHandler : onResolve; |
223 onReject = IS_UNDEFINED(onReject) ? PromiseIdRejectHandler : onReject; | 223 onReject = IS_UNDEFINED(onReject) ? PromiseIdRejectHandler : onReject; |
224 var deferred = %_CallFunction(this.constructor, PromiseDeferred); | 224 var deferred = %_CallFunction(this.constructor, PromiseDeferred); |
225 switch (GET_PRIVATE(this, promiseStatus)) { | 225 switch (GET_PRIVATE(this, promiseStatus)) { |
226 case UNDEFINED: | 226 case UNDEFINED: |
227 throw MakeTypeError('not_a_promise', [this]); | 227 throw MakeTypeError(kNotAPromise, this); |
228 case 0: // Pending | 228 case 0: // Pending |
229 GET_PRIVATE(this, promiseOnResolve).push(onResolve, deferred); | 229 GET_PRIVATE(this, promiseOnResolve).push(onResolve, deferred); |
230 GET_PRIVATE(this, promiseOnReject).push(onReject, deferred); | 230 GET_PRIVATE(this, promiseOnReject).push(onReject, deferred); |
231 break; | 231 break; |
232 case +1: // Resolved | 232 case +1: // Resolved |
233 PromiseEnqueue(GET_PRIVATE(this, promiseValue), | 233 PromiseEnqueue(GET_PRIVATE(this, promiseValue), |
234 [onResolve, deferred], | 234 [onResolve, deferred], |
235 +1); | 235 +1); |
236 break; | 236 break; |
237 case -1: // Rejected | 237 case -1: // Rejected |
(...skipping 27 matching lines...) Expand all Loading... |
265 onReject = IS_SPEC_FUNCTION(onReject) ? onReject | 265 onReject = IS_SPEC_FUNCTION(onReject) ? onReject |
266 : PromiseIdRejectHandler; | 266 : PromiseIdRejectHandler; |
267 var that = this; | 267 var that = this; |
268 var constructor = this.constructor; | 268 var constructor = this.constructor; |
269 return %_CallFunction( | 269 return %_CallFunction( |
270 this, | 270 this, |
271 function(x) { | 271 function(x) { |
272 x = PromiseCoerce(constructor, x); | 272 x = PromiseCoerce(constructor, x); |
273 if (x === that) { | 273 if (x === that) { |
274 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onReject); | 274 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onReject); |
275 return onReject(MakeTypeError('promise_cyclic', [x])); | 275 return onReject(MakeTypeError(kPromiseCyclic, x)); |
276 } else if (IsPromise(x)) { | 276 } else if (IsPromise(x)) { |
277 return x.then(onResolve, onReject); | 277 return x.then(onResolve, onReject); |
278 } else { | 278 } else { |
279 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onResolve); | 279 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onResolve); |
280 return onResolve(x); | 280 return onResolve(x); |
281 } | 281 } |
282 }, | 282 }, |
283 onReject, | 283 onReject, |
284 PromiseChain | 284 PromiseChain |
285 ); | 285 ); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 $promiseResolve = PromiseResolve; | 385 $promiseResolve = PromiseResolve; |
386 $promiseReject = PromiseReject; | 386 $promiseReject = PromiseReject; |
387 $promiseChain = PromiseChain; | 387 $promiseChain = PromiseChain; |
388 $promiseCatch = PromiseCatch; | 388 $promiseCatch = PromiseCatch; |
389 $promiseThen = PromiseThen; | 389 $promiseThen = PromiseThen; |
390 $promiseHasUserDefinedRejectHandler = PromiseHasUserDefinedRejectHandler; | 390 $promiseHasUserDefinedRejectHandler = PromiseHasUserDefinedRejectHandler; |
391 $promiseStatus = promiseStatus; | 391 $promiseStatus = promiseStatus; |
392 $promiseValue = promiseValue; | 392 $promiseValue = promiseValue; |
393 | 393 |
394 })(); | 394 })(); |
OLD | NEW |