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) { | 5 (function(global, utils) { |
6 | 6 |
7 "use strict"; | 7 "use strict"; |
8 | 8 |
9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); | 23 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol"); |
24 | 24 |
25 // ------------------------------------------------------------------- | 25 // ------------------------------------------------------------------- |
26 | 26 |
27 // Status values: 0 = pending, +1 = resolved, -1 = rejected | 27 // Status values: 0 = pending, +1 = resolved, -1 = rejected |
28 var lastMicrotaskId = 0; | 28 var lastMicrotaskId = 0; |
29 | 29 |
30 var GlobalPromise = function Promise(resolver) { | 30 var GlobalPromise = function Promise(resolver) { |
31 if (resolver === promiseRawSymbol) return; | 31 if (resolver === promiseRawSymbol) return; |
32 if (!%_IsConstructCall()) throw MakeTypeError(kNotAPromise, this); | 32 if (!%_IsConstructCall()) throw MakeTypeError(kNotAPromise, this); |
33 if (!IS_SPEC_FUNCTION(resolver)) | 33 if (!IS_CALLABLE(resolver)) |
34 throw MakeTypeError(kResolverNotAFunction, resolver); | 34 throw MakeTypeError(kResolverNotAFunction, resolver); |
35 var promise = PromiseInit(this); | 35 var promise = PromiseInit(this); |
36 try { | 36 try { |
37 %DebugPushPromise(promise, Promise); | 37 %DebugPushPromise(promise, Promise); |
38 resolver(function(x) { PromiseResolve(promise, x) }, | 38 resolver(function(x) { PromiseResolve(promise, x) }, |
39 function(r) { PromiseReject(promise, r) }); | 39 function(r) { PromiseReject(promise, r) }); |
40 } catch (e) { | 40 } catch (e) { |
41 PromiseReject(promise, e); | 41 PromiseReject(promise, e); |
42 } finally { | 42 } finally { |
43 %DebugPopPromise(); | 43 %DebugPopPromise(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } | 78 } |
79 | 79 |
80 function PromiseCoerce(constructor, x) { | 80 function PromiseCoerce(constructor, x) { |
81 if (!IsPromise(x) && IS_SPEC_OBJECT(x)) { | 81 if (!IsPromise(x) && IS_SPEC_OBJECT(x)) { |
82 var then; | 82 var then; |
83 try { | 83 try { |
84 then = x.then; | 84 then = x.then; |
85 } catch(r) { | 85 } catch(r) { |
86 return %_CallFunction(constructor, r, PromiseRejected); | 86 return %_CallFunction(constructor, r, PromiseRejected); |
87 } | 87 } |
88 if (IS_SPEC_FUNCTION(then)) { | 88 if (IS_CALLABLE(then)) { |
89 var deferred = %_CallFunction(constructor, PromiseDeferred); | 89 var deferred = %_CallFunction(constructor, PromiseDeferred); |
90 try { | 90 try { |
91 %_CallFunction(x, deferred.resolve, deferred.reject, then); | 91 %_CallFunction(x, deferred.resolve, deferred.reject, then); |
92 } catch(r) { | 92 } catch(r) { |
93 deferred.reject(r); | 93 deferred.reject(r); |
94 } | 94 } |
95 return deferred.promise; | 95 return deferred.promise; |
96 } | 96 } |
97 } | 97 } |
98 return x; | 98 return x; |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 return deferred.promise; | 252 return deferred.promise; |
253 } | 253 } |
254 | 254 |
255 function PromiseCatch(onReject) { | 255 function PromiseCatch(onReject) { |
256 return this.then(UNDEFINED, onReject); | 256 return this.then(UNDEFINED, onReject); |
257 } | 257 } |
258 | 258 |
259 // Multi-unwrapped chaining with thenable coercion. | 259 // Multi-unwrapped chaining with thenable coercion. |
260 | 260 |
261 function PromiseThen(onResolve, onReject) { | 261 function PromiseThen(onResolve, onReject) { |
262 onResolve = IS_SPEC_FUNCTION(onResolve) ? onResolve | 262 onResolve = IS_CALLABLE(onResolve) ? onResolve : PromiseIdResolveHandler; |
263 : PromiseIdResolveHandler; | 263 onReject = IS_CALLABLE(onReject) ? onReject : PromiseIdRejectHandler; |
264 onReject = IS_SPEC_FUNCTION(onReject) ? onReject | |
265 : PromiseIdRejectHandler; | |
266 var that = this; | 264 var that = this; |
267 var constructor = this.constructor; | 265 var constructor = this.constructor; |
268 return %_CallFunction( | 266 return %_CallFunction( |
269 this, | 267 this, |
270 function(x) { | 268 function(x) { |
271 x = PromiseCoerce(constructor, x); | 269 x = PromiseCoerce(constructor, x); |
272 if (x === that) { | 270 if (x === that) { |
273 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onReject); | 271 DEBUG_PREPARE_STEP_IN_IF_STEPPING(onReject); |
274 return onReject(MakeTypeError(kPromiseCyclic, x)); | 272 return onReject(MakeTypeError(kPromiseCyclic, x)); |
275 } else if (IsPromise(x)) { | 273 } else if (IsPromise(x)) { |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 "promise_catch", PromiseCatch, | 382 "promise_catch", PromiseCatch, |
385 "promise_chain", PromiseChain, | 383 "promise_chain", PromiseChain, |
386 "promise_create", PromiseCreate, | 384 "promise_create", PromiseCreate, |
387 "promise_has_user_defined_reject_handler", PromiseHasUserDefinedRejectHandler, | 385 "promise_has_user_defined_reject_handler", PromiseHasUserDefinedRejectHandler, |
388 "promise_reject", PromiseReject, | 386 "promise_reject", PromiseReject, |
389 "promise_resolve", PromiseResolve, | 387 "promise_resolve", PromiseResolve, |
390 "promise_then", PromiseThen, | 388 "promise_then", PromiseThen, |
391 ]); | 389 ]); |
392 | 390 |
393 }) | 391 }) |
OLD | NEW |