Changeset 161365 in webkit
- Timestamp:
- Jan 6, 2014 1:00:03 PM (10 years ago)
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r161344 r161365 1 2014-01-05 Sam Weinig <sam@webkit.org> 2 3 [JS] Implement Promise.all() 4 https://bugs.webkit.org/show_bug.cgi?id=126510 5 6 Reviewed by Gavin Barraclough. 7 8 Enabled and fix the existing Promise.all() test case. 9 - Promise.all() and Promise.all({}) should reject by my reading of the spec. 10 Also removes the Promise.all() shim used by the crypto tests. 11 12 * crypto/subtle/resources/common.js: 13 * js/dom/Promise-static-all-expected.txt: 14 * js/dom/Promise-static-all.html: 15 1 16 2014-01-06 Zan Dobersek <zdobersek@igalia.com> 2 17 -
trunk/LayoutTests/crypto/subtle/resources/common.js
r161241 r161365 102 102 }; 103 103 104 if (!Promise.all) {105 // A very simple temporary implementation only for WebCrypto tests.106 Promise.all = function(promises) {107 var results = [];108 var resultCount = 0;109 var resolver;110 var rejector;111 function next(result) {112 results[resultCount++] = result;113 if (resultCount < promises.length)114 promises[resultCount].then(next);115 else116 resolver(results);117 }118 promises[0].then(next, function() { rejector(null) });119 return new Promise(function(resolve, reject) { resolver = resolve; rejector = reject; });120 }121 }122 123 104 if (!crypto.subtle) 124 105 crypto.subtle = crypto.webkitSubtle; -
trunk/LayoutTests/js/dom/Promise-static-all-expected.txt
r161241 r161365 3 3 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". 4 4 5 PASS result is undefined 6 PASS Promise.all() is rejected. 7 PASS Promise.all([p1, p2, p3]) is fulfilled. 8 PASS result.length is 3 9 PASS result[0] is "p1" 10 PASS result[1] is "p2" 11 PASS result[2] is "p3" 12 PASS Promise.all([p1, p6, p5]) is rejected. 13 PASS result is "p6" 14 PASS Promise.all([p9]) is fulfilled. 15 PASS result.length is 1 16 PASS result[0] is "p2" 17 PASS Promise.all([p9,,,]) is fulfilled. 18 PASS result.length is 3 19 PASS result[0] is "p2" 20 PASS result[1] is undefined 21 PASS result[2] is undefined 22 PASS Promise.all([p9,42]) is fulfilled. 23 PASS result.length is 2 24 PASS result[0] is "p2" 25 PASS result[1] is 42 26 PASS Promise.all({}) is rejected. 5 27 PASS successfullyParsed is true 6 28 -
trunk/LayoutTests/js/dom/Promise-static-all.html
r161241 r161365 10 10 description('Test Promise.all'); 11 11 12 /*13 12 window.jsTestIsAsync = true; 14 13 result = undefined; … … 31 30 32 31 Promise.all().then(function(result) { 33 testPassed('Promise.all() is fulfilled.'); 34 window.result = result; 35 shouldBe('result.length', '0'); 32 testFailed('Promise.all() is fulfilled.'); 36 33 }, function() { 37 test Failed('Promise.all() is rejected.');34 testPassed('Promise.all() is rejected.'); 38 35 }).then(function() { 39 36 return Promise.all([p1, p2, p3]).then(function(result) { … … 91 88 // Not iterable object case. 92 89 return Promise.all({}).then(function(result) { 93 testPassed('Promise.all({}) is fulfilled.'); 94 window.result = result; 95 shouldBe('result.length', '0'); 90 testFailed('Promise.all({}) is fulfilled.'); 96 91 }, function(result) { 97 test Failed('Promise.all({}) is rejected.');92 testPassed('Promise.all({}) is rejected.'); 98 93 }); 99 94 }).then(finishJSTest, finishJSTest); 100 95 101 96 shouldBe('result', 'undefined'); 102 */103 97 104 98 </script> -
trunk/Source/JavaScriptCore/ChangeLog
r161364 r161365 1 2014-01-05 Sam Weinig <sam@webkit.org> 2 3 [JS] Implement Promise.all() 4 https://bugs.webkit.org/show_bug.cgi?id=126510 5 6 Reviewed by Gavin Barraclough. 7 8 Add Promise.all() implementation and factor out performing resolves and rejects 9 on deferreds to share a bit of code. Also moves the abruptRejection helper to 10 JSPromiseDeferred so it can be used in JSPromiseFunctions. 11 12 * runtime/CommonIdentifiers.h: 13 * runtime/JSPromiseConstructor.cpp: 14 (JSC::JSPromiseConstructorFuncCast): 15 (JSC::JSPromiseConstructorFuncResolve): 16 (JSC::JSPromiseConstructorFuncReject): 17 (JSC::JSPromiseConstructorFuncAll): 18 * runtime/JSPromiseDeferred.cpp: 19 (JSC::updateDeferredFromPotentialThenable): 20 (JSC::performDeferredResolve): 21 (JSC::performDeferredReject): 22 (JSC::abruptRejection): 23 * runtime/JSPromiseDeferred.h: 24 * runtime/JSPromiseFunctions.cpp: 25 (JSC::promiseAllCountdownFunction): 26 (JSC::createPromiseAllCountdownFunction): 27 * runtime/JSPromiseFunctions.h: 28 * runtime/JSPromiseReaction.cpp: 29 (JSC::ExecutePromiseReactionMicrotask::run): 30 1 31 2014-01-06 Filip Pizlo <fpizlo@apple.com> 2 32 -
trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h
r161330 r161365 213 213 macro(promise) \ 214 214 macro(fulfillmentHandler) \ 215 macro(rejectionHandler) 215 macro(rejectionHandler) \ 216 macro(index) \ 217 macro(values) \ 218 macro(deferred) \ 219 macro(countdownHolder) 216 220 217 221 namespace JSC { -
trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp
r161330 r161365 37 37 #include "JSPromisePrototype.h" 38 38 #include "Lookup.h" 39 #include "NumberObject.h" 39 40 #include "StructureInlines.h" 40 41 … … 47 48 static EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncReject(ExecState*); 48 49 static EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncRace(ExecState*); 50 static EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncAll(ExecState*); 49 51 } 50 52 … … 61 63 reject JSPromiseConstructorFuncReject DontEnum|Function 1 62 64 race JSPromiseConstructorFuncRace DontEnum|Function 1 65 all JSPromiseConstructorFuncAll DontEnum|Function 1 63 66 @end 64 67 */ … … 192 195 // of deferred.[[Resolve]] with undefined as thisArgument and a List containing x 193 196 // as argumentsList. 194 195 JSValue deferredResolve = deferred->resolve(); 196 197 CallData resolveCallData; 198 CallType resolveCallType = getCallData(deferredResolve, resolveCallData); 199 ASSERT(resolveCallType != CallTypeNone); 200 201 MarkedArgumentBuffer arguments; 202 arguments.append(x); 203 204 call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments); 197 performDeferredResolve(exec, deferred, x); 205 198 206 199 // 6. ReturnIfAbrupt(resolveResult). … … 232 225 // of deferred.[[Resolve]] with undefined as thisArgument and a List containing x 233 226 // as argumentsList. 234 235 JSValue deferredResolve = deferred->resolve(); 236 237 CallData resolveCallData; 238 CallType resolveCallType = getCallData(deferredResolve, resolveCallData); 239 ASSERT(resolveCallType != CallTypeNone); 240 241 MarkedArgumentBuffer arguments; 242 arguments.append(x); 243 244 call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments); 227 performDeferredResolve(exec, deferred, x); 245 228 246 229 // 5. ReturnIfAbrupt(resolveResult). … … 272 255 // of deferred.[[Reject]] with undefined as thisArgument and a List containing r 273 256 // as argumentsList. 274 275 JSValue deferredReject = deferred->reject(); 276 277 CallData rejectCallData; 278 CallType rejectCallType = getCallData(deferredReject, rejectCallData); 279 ASSERT(rejectCallType != CallTypeNone); 280 281 MarkedArgumentBuffer arguments; 282 arguments.append(r); 283 284 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), arguments); 257 performDeferredReject(exec, deferred, r); 285 258 286 259 // 5. ReturnIfAbrupt(resolveResult). … … 290 263 // 6. Return deferred.[[Promise]]. 291 264 return JSValue::encode(deferred->promise()); 292 }293 294 static JSValue abruptRejection(ExecState* exec, JSPromiseDeferred* deferred)295 {296 ASSERT(exec->hadException());297 JSValue argument = exec->exception();298 exec->clearException();299 300 // i. Let 'rejectResult' be the result of calling the [[Call]] internal method301 // of deferred.[[Reject]] with undefined as thisArgument and a List containing302 // argument.[[value]] as argumentsList.303 JSValue deferredReject = deferred->reject();304 305 CallData rejectCallData;306 CallType rejectCallType = getCallData(deferredReject, rejectCallData);307 ASSERT(rejectCallType != CallTypeNone);308 309 MarkedArgumentBuffer arguments;310 arguments.append(argument);311 312 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), arguments);313 314 // ii. ReturnIfAbrupt(rejectResult).315 if (exec->hadException())316 return jsUndefined();317 318 // iii. Return deferred.[[Promise]].319 return deferred->promise();320 265 } 321 266 … … 432 377 } 433 378 379 EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncAll(ExecState* exec) 380 { 381 // -- Promise.all(iterable) -- 382 383 JSValue iterable = exec->argument(0); 384 VM& vm = exec->vm(); 385 386 // 1. Let 'C' be the this value. 387 JSValue C = exec->thisValue(); 388 389 // 2. Let 'deferred' be the result of calling GetDeferred(C). 390 JSValue deferredValue = createJSPromiseDeferredFromConstructor(exec, C); 391 392 // 3. ReturnIfAbrupt(deferred). 393 if (exec->hadException()) 394 return JSValue::encode(jsUndefined()); 395 396 // NOTE: A non-abrupt completion of createJSPromiseDeferredFromConstructor implies that 397 // C and deferredValue are objects. 398 JSObject* thisObject = asObject(C); 399 JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(deferredValue); 400 401 // 4. Let 'iterator' be the result of calling GetIterator(iterable). 402 JSValue iteratorFunction = iterable.get(exec, vm.propertyNames->iteratorPrivateName); 403 if (exec->hadException()) 404 return JSValue::encode(abruptRejection(exec, deferred)); 405 406 CallData iteratorFunctionCallData; 407 CallType iteratorFunctionCallType = getCallData(iteratorFunction, iteratorFunctionCallData); 408 if (iteratorFunctionCallType == CallTypeNone) { 409 throwTypeError(exec); 410 return JSValue::encode(abruptRejection(exec, deferred)); 411 } 412 413 ArgList iteratorFunctionArguments; 414 JSValue iterator = call(exec, iteratorFunction, iteratorFunctionCallType, iteratorFunctionCallData, iterable, iteratorFunctionArguments); 415 416 // 5. RejectIfAbrupt(iterator, deferred). 417 if (exec->hadException()) 418 return JSValue::encode(abruptRejection(exec, deferred)); 419 420 // 6. Let 'values' be the result of calling ArrayCreate(0). 421 JSArray* values = constructEmptyArray(exec, nullptr, thisObject->globalObject()); 422 423 // 7. Let 'countdownHolder' be Record { [[Countdown]]: 0 }. 424 NumberObject* countdownHolder = constructNumber(exec, thisObject->globalObject(), JSValue(0)); 425 426 // 8. Let 'index' be 0. 427 unsigned index = 0; 428 429 // 9. Repeat. 430 do { 431 // i. Let 'next' be the result of calling IteratorStep(iterator). 432 JSValue nextFunction = iterator.get(exec, exec->vm().propertyNames->iteratorNextPrivateName); 433 if (exec->hadException()) 434 return JSValue::encode(abruptRejection(exec, deferred)); 435 436 CallData nextFunctionCallData; 437 CallType nextFunctionCallType = getCallData(nextFunction, nextFunctionCallData); 438 if (nextFunctionCallType == CallTypeNone) { 439 throwTypeError(exec); 440 return JSValue::encode(abruptRejection(exec, deferred)); 441 } 442 443 MarkedArgumentBuffer nextFunctionArguments; 444 nextFunctionArguments.append(jsUndefined()); 445 JSValue next = call(exec, nextFunction, nextFunctionCallType, nextFunctionCallData, iterator, nextFunctionArguments); 446 447 // ii. RejectIfAbrupt(next, deferred). 448 if (exec->hadException()) 449 return JSValue::encode(abruptRejection(exec, deferred)); 450 451 // iii. If 'next' is false, 452 // Note: We implement this as an iterationTerminator 453 if (next == vm.iterationTerminator.get()) { 454 // a. If 'index' is 0, 455 if (!index) { 456 // a. Let 'resolveResult' be the result of calling the [[Call]] internal method 457 // of deferred.[[Resolve]] with undefined as thisArgument and a List containing 458 // values as argumentsList. 459 performDeferredResolve(exec, deferred, values); 460 461 // b. ReturnIfAbrupt(resolveResult). 462 if (exec->hadException()) 463 return JSValue::encode(jsUndefined()); 464 } 465 466 // b. Return deferred.[[Promise]]. 467 return JSValue::encode(deferred->promise()); 468 } 469 470 // iv. Let 'nextValue' be the result of calling IteratorValue(next). 471 // v. RejectIfAbrupt(nextValue, deferred). 472 // Note: 'next' is already the value, so there is nothing to do here. 473 474 // vi. Let 'nextPromise' be the result of calling Invoke(C, "cast", (nextValue)). 475 JSValue castFunction = C.get(exec, vm.propertyNames->cast); 476 if (exec->hadException()) 477 return JSValue::encode(abruptRejection(exec, deferred)); 478 479 CallData castFunctionCallData; 480 CallType castFunctionCallType = getCallData(castFunction, castFunctionCallData); 481 if (castFunctionCallType == CallTypeNone) { 482 throwTypeError(exec); 483 return JSValue::encode(abruptRejection(exec, deferred)); 484 } 485 486 MarkedArgumentBuffer castFunctionArguments; 487 castFunctionArguments.append(next); 488 JSValue nextPromise = call(exec, castFunction, castFunctionCallType, castFunctionCallData, C, castFunctionArguments); 489 490 // vii. RejectIfAbrupt(nextPromise, deferred). 491 if (exec->hadException()) 492 return JSValue::encode(abruptRejection(exec, deferred)); 493 494 // viii. Let 'countdownFunction' be a new built-in function object as defined in Promise.all Countdown Functions. 495 JSFunction* countdownFunction = createPromiseAllCountdownFunction(vm, thisObject->globalObject()); 496 497 // ix. Set the [[Index]] internal slot of 'countdownFunction' to 'index'. 498 countdownFunction->putDirect(vm, vm.propertyNames->indexPrivateName, JSValue(index)); 499 500 // x. Set the [[Values]] internal slot of 'countdownFunction' to 'values'. 501 countdownFunction->putDirect(vm, vm.propertyNames->valuesPrivateName, values); 502 503 // xi. Set the [[Deferred]] internal slot of 'countdownFunction' to 'deferred'. 504 countdownFunction->putDirect(vm, vm.propertyNames->deferredPrivateName, deferred); 505 506 // xii. Set the [[CountdownHolder]] internal slot of 'countdownFunction' to 'countdownHolder'. 507 countdownFunction->putDirect(vm, vm.propertyNames->countdownHolderPrivateName, countdownHolder); 508 509 // xiii. Let 'result' be the result of calling Invoke(nextPromise, "then", (countdownFunction, deferred.[[Reject]])). 510 JSValue thenFunction = nextPromise.get(exec, vm.propertyNames->then); 511 if (exec->hadException()) 512 return JSValue::encode(abruptRejection(exec, deferred)); 513 514 CallData thenFunctionCallData; 515 CallType thenFunctionCallType = getCallData(thenFunction, thenFunctionCallData); 516 if (thenFunctionCallType == CallTypeNone) { 517 throwTypeError(exec); 518 return JSValue::encode(abruptRejection(exec, deferred)); 519 } 520 521 MarkedArgumentBuffer thenFunctionArguments; 522 thenFunctionArguments.append(countdownFunction); 523 thenFunctionArguments.append(deferred->reject()); 524 525 call(exec, thenFunction, thenFunctionCallType, thenFunctionCallData, nextPromise, thenFunctionArguments); 526 527 // xiv. RejectIfAbrupt(result, deferred). 528 if (exec->hadException()) 529 return JSValue::encode(abruptRejection(exec, deferred)); 530 531 // xv. Set index to index + 1. 532 index++; 533 534 // xvi. Set countdownHolder.[[Countdown]] to countdownHolder.[[Countdown]] + 1. 535 uint32_t newCountdownValue = countdownHolder->internalValue().asUInt32() + 1; 536 countdownHolder->setInternalValue(vm, JSValue(newCountdownValue)); 537 } while (true); 538 } 539 434 540 JSPromise* constructPromise(ExecState* exec, JSGlobalObject* globalObject, JSFunction* resolver) 435 541 { -
trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp
r161241 r161365 153 153 exec->clearException(); 154 154 155 JSValue deferredReject = deferred->reject(); 156 157 CallData rejectCallData; 158 CallType rejectCallType = getCallData(deferredReject, rejectCallData); 159 ASSERT(rejectCallType != CallTypeNone); 160 161 MarkedArgumentBuffer rejectArguments; 162 rejectArguments.append(exception); 163 164 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments); 155 performDeferredReject(exec, deferred, exception); 165 156 166 157 // ii. ReturnIfAbrupt(rejectResult). … … 197 188 exec->clearException(); 198 189 199 JSValue deferredReject = deferred->reject(); 200 201 CallData rejectCallData; 202 CallType rejectCallType = getCallData(deferredReject, rejectCallData); 203 ASSERT(rejectCallType != CallTypeNone); 204 205 MarkedArgumentBuffer rejectArguments; 206 rejectArguments.append(exception); 207 208 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments); 190 performDeferredReject(exec, deferred, exception); 209 191 210 192 // ii. ReturnIfAbrupt(rejectResult). … … 215 197 } 216 198 199 void performDeferredResolve(ExecState* exec, JSPromiseDeferred* deferred, JSValue argument) 200 { 201 JSValue deferredResolve = deferred->resolve(); 202 203 CallData resolveCallData; 204 CallType resolveCallType = getCallData(deferredResolve, resolveCallData); 205 ASSERT(resolveCallType != CallTypeNone); 206 207 MarkedArgumentBuffer arguments; 208 arguments.append(argument); 209 210 call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments); 211 } 212 213 void performDeferredReject(ExecState* exec, JSPromiseDeferred* deferred, JSValue argument) 214 { 215 JSValue deferredReject = deferred->reject(); 216 217 CallData rejectCallData; 218 CallType rejectCallType = getCallData(deferredReject, rejectCallData); 219 ASSERT(rejectCallType != CallTypeNone); 220 221 MarkedArgumentBuffer arguments; 222 arguments.append(argument); 223 224 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), arguments); 225 } 226 227 JSValue abruptRejection(ExecState* exec, JSPromiseDeferred* deferred) 228 { 229 ASSERT(exec->hadException()); 230 JSValue argument = exec->exception(); 231 exec->clearException(); 232 233 // i. Let 'rejectResult' be the result of calling the [[Call]] internal method 234 // of deferred.[[Reject]] with undefined as thisArgument and a List containing 235 // argument.[[value]] as argumentsList. 236 performDeferredReject(exec, deferred, argument); 237 238 // ii. ReturnIfAbrupt(rejectResult). 239 if (exec->hadException()) 240 return jsUndefined(); 241 242 // iii. Return deferred.[[Promise]]. 243 return deferred->promise(); 244 } 245 217 246 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h
r161241 r161365 71 71 ThenableStatus updateDeferredFromPotentialThenable(ExecState*, JSValue, JSPromiseDeferred*); 72 72 73 void performDeferredResolve(ExecState*, JSPromiseDeferred*, JSValue argument); 74 void performDeferredReject(ExecState*, JSPromiseDeferred*, JSValue argument); 75 76 JSValue abruptRejection(ExecState*, JSPromiseDeferred*); 77 73 78 } // namespace JSC 74 79 -
trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.cpp
r161241 r161365 35 35 #include "JSPromiseConstructor.h" 36 36 #include "JSPromiseDeferred.h" 37 #include "NumberObject.h" 37 38 38 39 namespace JSC { … … 70 71 { 71 72 return JSFunction::create(vm, globalObject, 1, ASCIILiteral("IdentityFunction"), identifyFunction); 73 } 74 75 // Promise.All Countdown Functions 76 77 static EncodedJSValue JSC_HOST_CALL promiseAllCountdownFunction(ExecState* exec) 78 { 79 JSValue x = exec->argument(0); 80 VM& vm = exec->vm(); 81 JSObject* F = exec->callee(); 82 83 // 1. Let 'index' be the value of F's [[Index]] internal slot. 84 uint32_t index = F->get(exec, vm.propertyNames->indexPrivateName).asUInt32(); 85 86 // 2. Let 'values' be the value of F's [[Values]] internal slot.. 87 JSArray* values = jsCast<JSArray*>(F->get(exec, vm.propertyNames->valuesPrivateName)); 88 89 // 3. Let 'deferred' be the value of F's [[Deferred]] internal slot. 90 JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(F->get(exec, vm.propertyNames->deferredPrivateName)); 91 92 // 4. Let 'countdownHolder' be the value of F's [[CountdownHolder]] internal slot. 93 NumberObject* countdownHolder = jsCast<NumberObject*>(F->get(exec, vm.propertyNames->countdownHolderPrivateName)); 94 95 // 5. Let 'result' be the result of calling the [[DefineOwnProperty]] internal method 96 // of 'values' with arguments 'index' and Property Descriptor { [[Value]]: x, 97 // [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }. 98 values->putDirectIndex(exec, index, x); 99 100 // 6. RejectIfAbrupt(result, deferred). 101 if (exec->hadException()) 102 abruptRejection(exec, deferred); 103 104 // 7. Set countdownHolder.[[Countdown]] to countdownHolder.[[Countdown]] - 1. 105 uint32_t newCountdownValue = countdownHolder->internalValue().asUInt32() - 1; 106 countdownHolder->setInternalValue(vm, JSValue(newCountdownValue)); 107 108 // 8. If countdownHolder.[[Countdown]] is 0, 109 if (!newCountdownValue) { 110 // i. Return the result of calling the [[Call]] internal method of deferred.[[Resolve]] 111 // with undefined as thisArgument and a List containing 'values' as argumentsList. 112 performDeferredResolve(exec, deferred, values); 113 } 114 115 // 9. Return. 116 return JSValue::encode(jsUndefined()); 117 } 118 119 JSFunction* createPromiseAllCountdownFunction(VM& vm, JSGlobalObject* globalObject) 120 { 121 return JSFunction::create(vm, globalObject, 1, ASCIILiteral("PromiseAllCountdownFunction"), promiseAllCountdownFunction); 72 122 } 73 123 -
trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.h
r161241 r161365 35 35 JSFunction* createDeferredConstructionFunction(VM&, JSGlobalObject*); 36 36 JSFunction* createIdentifyFunction(VM&, JSGlobalObject*); 37 JSFunction* createPromiseAllCountdownFunction(VM&, JSGlobalObject*); 37 38 JSFunction* createPromiseResolutionHandlerFunction(VM&, JSGlobalObject*); 38 39 JSFunction* createRejectPromiseFunction(VM&, JSGlobalObject*); -
trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.cpp
r161317 r161365 90 90 exec->clearException(); 91 91 92 JSValue deferredReject = deferred->reject(); 93 94 CallData rejectCallData; 95 CallType rejectCallType = getCallData(deferredReject, rejectCallData); 96 ASSERT(rejectCallType != CallTypeNone); 97 98 MarkedArgumentBuffer rejectArguments; 99 rejectArguments.append(exception); 100 101 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments); 102 // FIXME: Should we return the result somewhere? 92 performDeferredReject(exec, deferred, exception); 103 93 } 104 94 … … 110 100 // i. Let 'selfResolutionError' be a newly-created TypeError object. 111 101 JSObject* selfResolutionError = createTypeError(exec, ASCIILiteral("Resolve a promise with itself")); 102 112 103 // ii. Return the result of calling the [[Call]] internal method of deferred.[[Reject]] passing 113 104 // undefined as thisArgument and a List containing selfResolutionError as argumentsList. 114 JSValue deferredReject = deferred->reject(); 115 116 CallData rejectCallData; 117 CallType rejectCallType = getCallData(deferredReject, rejectCallData); 118 ASSERT(rejectCallType != CallTypeNone); 119 120 MarkedArgumentBuffer rejectArguments; 121 rejectArguments.append(selfResolutionError); 122 123 call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments); 124 // FIXME: Should we return the result somewhere? 105 performDeferredReject(exec, deferred, selfResolutionError); 125 106 } 126 107 … … 136 117 // i. Return the result of calling the [[Call]] internal method of deferred.[[Resolve]] 137 118 // passing undefined as thisArgument and a List containing handlerResult as argumentsList. 138 139 JSValue deferredResolve = deferred->resolve(); 140 141 CallData resolveCallData; 142 CallType resolveCallType = getCallData(deferredResolve, resolveCallData); 143 ASSERT(resolveCallType != CallTypeNone); 144 145 MarkedArgumentBuffer arguments; 146 arguments.append(handlerResult); 147 148 call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments); 149 // FIXME: Should we return the result somewhere? 119 performDeferredResolve(exec, deferred, handlerResult); 150 120 } 151 121 }
Note: See TracChangeset
for help on using the changeset viewer.