| 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 |