| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #include "src/builtins/builtins-promise.h" | 5 #include "src/builtins/builtins-promise.h" |
| 6 #include "src/builtins/builtins-constructor.h" | 6 #include "src/builtins/builtins-constructor.h" |
| 7 #include "src/builtins/builtins-utils.h" | 7 #include "src/builtins/builtins-utils.h" |
| 8 #include "src/builtins/builtins.h" | 8 #include "src/builtins/builtins.h" |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/code-stub-assembler.h" | 10 #include "src/code-stub-assembler.h" |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 Node* const result = InternalPerformPromiseThen( | 413 Node* const result = InternalPerformPromiseThen( |
| 414 context, promise, on_resolve, on_reject, var_deferred_promise.value(), | 414 context, promise, on_resolve, on_reject, var_deferred_promise.value(), |
| 415 var_deferred_on_resolve.value(), var_deferred_on_reject.value()); | 415 var_deferred_on_resolve.value(), var_deferred_on_reject.value()); |
| 416 return result; | 416 return result; |
| 417 } | 417 } |
| 418 | 418 |
| 419 Node* PromiseBuiltinsAssembler::InternalPerformPromiseThen( | 419 Node* PromiseBuiltinsAssembler::InternalPerformPromiseThen( |
| 420 Node* context, Node* promise, Node* on_resolve, Node* on_reject, | 420 Node* context, Node* promise, Node* on_resolve, Node* on_reject, |
| 421 Node* deferred_promise, Node* deferred_on_resolve, | 421 Node* deferred_promise, Node* deferred_on_resolve, |
| 422 Node* deferred_on_reject) { | 422 Node* deferred_on_reject) { |
| 423 Node* const native_context = LoadNativeContext(context); | |
| 424 | 423 |
| 425 Variable var_on_resolve(this, MachineRepresentation::kTagged), | 424 Variable var_on_resolve(this, MachineRepresentation::kTagged), |
| 426 var_on_reject(this, MachineRepresentation::kTagged); | 425 var_on_reject(this, MachineRepresentation::kTagged); |
| 427 | 426 |
| 428 var_on_resolve.Bind(on_resolve); | 427 var_on_resolve.Bind(on_resolve); |
| 429 var_on_reject.Bind(on_reject); | 428 var_on_reject.Bind(on_reject); |
| 430 | 429 |
| 431 Label out(this), if_onresolvenotcallable(this), onrejectcheck(this), | 430 Label out(this), if_onresolvenotcallable(this), onrejectcheck(this), |
| 432 append_callbacks(this); | 431 append_callbacks(this); |
| 433 GotoIf(TaggedIsSmi(on_resolve), &if_onresolvenotcallable); | 432 GotoIf(TaggedIsSmi(on_resolve), &if_onresolvenotcallable); |
| 434 | 433 |
| 434 Isolate* isolate = this->isolate(); |
| 435 Node* const on_resolve_map = LoadMap(on_resolve); | 435 Node* const on_resolve_map = LoadMap(on_resolve); |
| 436 Branch(IsCallableMap(on_resolve_map), &onrejectcheck, | 436 Branch(IsCallableMap(on_resolve_map), &onrejectcheck, |
| 437 &if_onresolvenotcallable); | 437 &if_onresolvenotcallable); |
| 438 | 438 |
| 439 Bind(&if_onresolvenotcallable); | 439 Bind(&if_onresolvenotcallable); |
| 440 { | 440 { |
| 441 var_on_resolve.Bind(LoadContextElement( | 441 Isolate* isolate = this->isolate(); |
| 442 native_context, Context::PROMISE_ID_RESOLVE_HANDLER_INDEX)); | 442 Node* const default_resolve_handler_symbol = HeapConstant( |
| 443 isolate->factory()->promise_default_resolve_handler_symbol()); |
| 444 var_on_resolve.Bind(default_resolve_handler_symbol); |
| 443 Goto(&onrejectcheck); | 445 Goto(&onrejectcheck); |
| 444 } | 446 } |
| 445 | 447 |
| 446 Bind(&onrejectcheck); | 448 Bind(&onrejectcheck); |
| 447 { | 449 { |
| 448 Label if_onrejectnotcallable(this); | 450 Label if_onrejectnotcallable(this); |
| 449 GotoIf(TaggedIsSmi(on_reject), &if_onrejectnotcallable); | 451 GotoIf(TaggedIsSmi(on_reject), &if_onrejectnotcallable); |
| 450 | 452 |
| 451 Node* const on_reject_map = LoadMap(on_reject); | 453 Node* const on_reject_map = LoadMap(on_reject); |
| 452 Branch(IsCallableMap(on_reject_map), &append_callbacks, | 454 Branch(IsCallableMap(on_reject_map), &append_callbacks, |
| 453 &if_onrejectnotcallable); | 455 &if_onrejectnotcallable); |
| 454 | 456 |
| 455 Bind(&if_onrejectnotcallable); | 457 Bind(&if_onrejectnotcallable); |
| 456 { | 458 { |
| 457 var_on_reject.Bind(LoadContextElement( | 459 Node* const default_reject_handler_symbol = HeapConstant( |
| 458 native_context, Context::PROMISE_ID_REJECT_HANDLER_INDEX)); | 460 isolate->factory()->promise_default_reject_handler_symbol()); |
| 461 var_on_reject.Bind(default_reject_handler_symbol); |
| 459 Goto(&append_callbacks); | 462 Goto(&append_callbacks); |
| 460 } | 463 } |
| 461 } | 464 } |
| 462 | 465 |
| 463 Bind(&append_callbacks); | 466 Bind(&append_callbacks); |
| 464 { | 467 { |
| 465 Label fulfilled_check(this); | 468 Label fulfilled_check(this); |
| 466 Node* const status = LoadObjectField(promise, JSPromise::kStatusOffset); | 469 Node* const status = LoadObjectField(promise, JSPromise::kStatusOffset); |
| 467 GotoUnless(SmiEqual(status, SmiConstant(v8::Promise::kPending)), | 470 GotoUnless(SmiEqual(status, SmiConstant(v8::Promise::kPending)), |
| 468 &fulfilled_check); | 471 &fulfilled_check); |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1258 | 1261 |
| 1259 Bind(&promisehook_before); | 1262 Bind(&promisehook_before); |
| 1260 { | 1263 { |
| 1261 GotoUnless(IsPromiseHookEnabledOrDebugIsActive(), &run_handler); | 1264 GotoUnless(IsPromiseHookEnabledOrDebugIsActive(), &run_handler); |
| 1262 CallRuntime(Runtime::kPromiseHookBefore, context, deferred_promise); | 1265 CallRuntime(Runtime::kPromiseHookBefore, context, deferred_promise); |
| 1263 Goto(&run_handler); | 1266 Goto(&run_handler); |
| 1264 } | 1267 } |
| 1265 | 1268 |
| 1266 Bind(&run_handler); | 1269 Bind(&run_handler); |
| 1267 { | 1270 { |
| 1268 Callable call_callable = CodeFactory::Call(isolate); | 1271 Label if_defaulthandler(this), if_callablehandler(this), |
| 1269 Node* const result = | 1272 if_internalhandler(this), if_customhandler(this, Label::kDeferred); |
| 1270 CallJS(call_callable, context, handler, UndefinedConstant(), value); | 1273 Variable var_result(this, MachineRepresentation::kTagged); |
| 1271 | 1274 |
| 1272 GotoIfException(result, &if_rejectpromise, &var_reason); | 1275 Branch(IsSymbol(handler), &if_defaulthandler, &if_callablehandler); |
| 1273 | 1276 |
| 1274 Label if_internalhandler(this), if_customhandler(this, Label::kDeferred); | 1277 Bind(&if_defaulthandler); |
| 1275 Branch(IsUndefined(deferred_on_resolve), &if_internalhandler, | 1278 { |
| 1276 &if_customhandler); | 1279 Label if_resolve(this), if_reject(this); |
| 1280 Node* const default_resolve_handler_symbol = HeapConstant( |
| 1281 isolate->factory()->promise_default_resolve_handler_symbol()); |
| 1282 Branch(WordEqual(default_resolve_handler_symbol, handler), &if_resolve, |
| 1283 &if_reject); |
| 1284 |
| 1285 Bind(&if_resolve); |
| 1286 { |
| 1287 var_result.Bind(value); |
| 1288 Branch(IsUndefined(deferred_on_resolve), &if_internalhandler, |
| 1289 &if_customhandler); |
| 1290 } |
| 1291 |
| 1292 Bind(&if_reject); |
| 1293 { |
| 1294 var_reason.Bind(value); |
| 1295 Goto(&if_rejectpromise); |
| 1296 } |
| 1297 } |
| 1298 |
| 1299 Bind(&if_callablehandler); |
| 1300 { |
| 1301 Callable call_callable = CodeFactory::Call(isolate); |
| 1302 Node* const result = |
| 1303 CallJS(call_callable, context, handler, UndefinedConstant(), value); |
| 1304 var_result.Bind(result); |
| 1305 GotoIfException(result, &if_rejectpromise, &var_reason); |
| 1306 Branch(IsUndefined(deferred_on_resolve), &if_internalhandler, |
| 1307 &if_customhandler); |
| 1308 } |
| 1277 | 1309 |
| 1278 Bind(&if_internalhandler); | 1310 Bind(&if_internalhandler); |
| 1279 InternalResolvePromise(context, deferred_promise, result); | 1311 InternalResolvePromise(context, deferred_promise, var_result.value()); |
| 1280 Goto(&promisehook_after); | 1312 Goto(&promisehook_after); |
| 1281 | 1313 |
| 1282 Bind(&if_customhandler); | 1314 Bind(&if_customhandler); |
| 1283 { | 1315 { |
| 1316 Callable call_callable = CodeFactory::Call(isolate); |
| 1284 Node* const maybe_exception = | 1317 Node* const maybe_exception = |
| 1285 CallJS(call_callable, context, deferred_on_resolve, | 1318 CallJS(call_callable, context, deferred_on_resolve, |
| 1286 UndefinedConstant(), result); | 1319 UndefinedConstant(), var_result.value()); |
| 1287 GotoIfException(maybe_exception, &if_rejectpromise, &var_reason); | 1320 GotoIfException(maybe_exception, &if_rejectpromise, &var_reason); |
| 1288 Goto(&promisehook_after); | 1321 Goto(&promisehook_after); |
| 1289 } | 1322 } |
| 1290 } | 1323 } |
| 1291 | 1324 |
| 1292 Bind(&if_rejectpromise); | 1325 Bind(&if_rejectpromise); |
| 1293 { | 1326 { |
| 1294 Callable promise_handle_reject = CodeFactory::PromiseHandleReject(isolate); | 1327 Callable promise_handle_reject = CodeFactory::PromiseHandleReject(isolate); |
| 1295 CallStub(promise_handle_reject, context, deferred_promise, | 1328 CallStub(promise_handle_reject, context, deferred_promise, |
| 1296 deferred_on_reject, var_reason.value()); | 1329 deferred_on_reject, var_reason.value()); |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 Node* const reason = Parameter(2); | 1559 Node* const reason = Parameter(2); |
| 1527 Node* const debug_event = Parameter(3); | 1560 Node* const debug_event = Parameter(3); |
| 1528 Node* const context = Parameter(6); | 1561 Node* const context = Parameter(6); |
| 1529 | 1562 |
| 1530 InternalPromiseReject(context, promise, reason, debug_event); | 1563 InternalPromiseReject(context, promise, reason, debug_event); |
| 1531 Return(UndefinedConstant()); | 1564 Return(UndefinedConstant()); |
| 1532 } | 1565 } |
| 1533 | 1566 |
| 1534 } // namespace internal | 1567 } // namespace internal |
| 1535 } // namespace v8 | 1568 } // namespace v8 |
| OLD | NEW |