Index: src/builtins/builtins-promise.cc |
diff --git a/src/builtins/builtins-promise.cc b/src/builtins/builtins-promise.cc |
index 23bd4ed221e73d218671c12a0498fdad5eb17243..2805d611720e206cff4f031875cc2d6331672730 100644 |
--- a/src/builtins/builtins-promise.cc |
+++ b/src/builtins/builtins-promise.cc |
@@ -420,7 +420,6 @@ Node* PromiseBuiltinsAssembler::InternalPerformPromiseThen( |
Node* context, Node* promise, Node* on_resolve, Node* on_reject, |
Node* deferred_promise, Node* deferred_on_resolve, |
Node* deferred_on_reject) { |
- Node* const native_context = LoadNativeContext(context); |
Variable var_on_resolve(this, MachineRepresentation::kTagged), |
var_on_reject(this, MachineRepresentation::kTagged); |
@@ -432,14 +431,17 @@ Node* PromiseBuiltinsAssembler::InternalPerformPromiseThen( |
append_callbacks(this); |
GotoIf(TaggedIsSmi(on_resolve), &if_onresolvenotcallable); |
+ Isolate* isolate = this->isolate(); |
Node* const on_resolve_map = LoadMap(on_resolve); |
Branch(IsCallableMap(on_resolve_map), &onrejectcheck, |
&if_onresolvenotcallable); |
Bind(&if_onresolvenotcallable); |
{ |
- var_on_resolve.Bind(LoadContextElement( |
- native_context, Context::PROMISE_ID_RESOLVE_HANDLER_INDEX)); |
+ Isolate* isolate = this->isolate(); |
+ Node* const default_resolve_handler_symbol = HeapConstant( |
+ isolate->factory()->promise_default_resolve_handler_symbol()); |
+ var_on_resolve.Bind(default_resolve_handler_symbol); |
Goto(&onrejectcheck); |
} |
@@ -454,8 +456,9 @@ Node* PromiseBuiltinsAssembler::InternalPerformPromiseThen( |
Bind(&if_onrejectnotcallable); |
{ |
- var_on_reject.Bind(LoadContextElement( |
- native_context, Context::PROMISE_ID_REJECT_HANDLER_INDEX)); |
+ Node* const default_reject_handler_symbol = HeapConstant( |
+ isolate->factory()->promise_default_reject_handler_symbol()); |
+ var_on_reject.Bind(default_reject_handler_symbol); |
Goto(&append_callbacks); |
} |
} |
@@ -1265,25 +1268,55 @@ TF_BUILTIN(PromiseHandle, PromiseBuiltinsAssembler) { |
Bind(&run_handler); |
{ |
- Callable call_callable = CodeFactory::Call(isolate); |
- Node* const result = |
- CallJS(call_callable, context, handler, UndefinedConstant(), value); |
+ Label if_defaulthandler(this), if_callablehandler(this), |
+ if_internalhandler(this), if_customhandler(this, Label::kDeferred); |
+ Variable var_result(this, MachineRepresentation::kTagged); |
- GotoIfException(result, &if_rejectpromise, &var_reason); |
+ Branch(IsSymbol(handler), &if_defaulthandler, &if_callablehandler); |
- Label if_internalhandler(this), if_customhandler(this, Label::kDeferred); |
- Branch(IsUndefined(deferred_on_resolve), &if_internalhandler, |
- &if_customhandler); |
+ Bind(&if_defaulthandler); |
+ { |
+ Label if_resolve(this), if_reject(this); |
+ Node* const default_resolve_handler_symbol = HeapConstant( |
+ isolate->factory()->promise_default_resolve_handler_symbol()); |
+ Branch(WordEqual(default_resolve_handler_symbol, handler), &if_resolve, |
+ &if_reject); |
+ |
+ Bind(&if_resolve); |
+ { |
+ var_result.Bind(value); |
+ Branch(IsUndefined(deferred_on_resolve), &if_internalhandler, |
+ &if_customhandler); |
+ } |
+ |
+ Bind(&if_reject); |
+ { |
+ var_reason.Bind(value); |
+ Goto(&if_rejectpromise); |
+ } |
+ } |
+ |
+ Bind(&if_callablehandler); |
+ { |
+ Callable call_callable = CodeFactory::Call(isolate); |
+ Node* const result = |
+ CallJS(call_callable, context, handler, UndefinedConstant(), value); |
+ var_result.Bind(result); |
+ GotoIfException(result, &if_rejectpromise, &var_reason); |
+ Branch(IsUndefined(deferred_on_resolve), &if_internalhandler, |
+ &if_customhandler); |
+ } |
Bind(&if_internalhandler); |
- InternalResolvePromise(context, deferred_promise, result); |
+ InternalResolvePromise(context, deferred_promise, var_result.value()); |
Goto(&promisehook_after); |
Bind(&if_customhandler); |
{ |
+ Callable call_callable = CodeFactory::Call(isolate); |
Node* const maybe_exception = |
CallJS(call_callable, context, deferred_on_resolve, |
- UndefinedConstant(), result); |
+ UndefinedConstant(), var_result.value()); |
GotoIfException(maybe_exception, &if_rejectpromise, &var_reason); |
Goto(&promisehook_after); |
} |