Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: src/builtins/builtins-promise.cc

Issue 2572623002: PromiseHandle port to TF (Closed)
Patch Set: fix ordering Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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-utils.h" 5 #include "src/builtins/builtins-utils.h"
6 #include "src/builtins/builtins.h" 6 #include "src/builtins/builtins.h"
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/code-stub-assembler.h" 8 #include "src/code-stub-assembler.h"
9 #include "src/promise-utils.h" 9 #include "src/promise-utils.h"
10 10
(...skipping 874 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 Node* const result = a.Parameter(2); 885 Node* const result = a.Parameter(2);
886 Node* const context = a.Parameter(5); 886 Node* const context = a.Parameter(5);
887 887
888 Label out(&a); 888 Label out(&a);
889 InternalResolvePromise(&a, context, promise, result, &out); 889 InternalResolvePromise(&a, context, promise, result, &out);
890 890
891 a.Bind(&out); 891 a.Bind(&out);
892 a.Return(a.UndefinedConstant()); 892 a.Return(a.UndefinedConstant());
893 } 893 }
894 894
895 void Builtins::Generate_PromiseHandleReject(
896 compiler::CodeAssemblerState* state) {
897 CodeStubAssembler a(state);
898 typedef compiler::Node Node;
899 typedef CodeStubAssembler::Label Label;
900 typedef CodeStubAssembler::Variable Variable;
901 typedef PromiseHandleRejectDescriptor Descriptor;
902
903 Node* const promise = a.Parameter(Descriptor::kPromise);
904 Node* const on_reject = a.Parameter(Descriptor::kOnReject);
905 Node* const exception = a.Parameter(Descriptor::kException);
906 Node* const context = a.Parameter(Descriptor::kContext);
907 Isolate* isolate = a.isolate();
908
909 Callable call_callable = CodeFactory::Call(isolate);
910 Variable var_unused(&a, MachineRepresentation::kTagged);
911
912 Label out(&a), if_internalhandler(&a), if_customhandler(&a, Label::kDeferred);
913 a.Branch(a.IsUndefined(on_reject), &if_internalhandler, &if_customhandler);
914
915 a.Bind(&if_internalhandler);
916 {
917 a.CallRuntime(Runtime::kPromiseReject, context, promise, exception,
918 a.FalseConstant());
919 a.Goto(&out);
Igor Sheludko 2016/12/13 23:09:00 Maybe a.Return(a.UndefinedConstant()); ?
gsathya 2016/12/13 23:51:02 Done.
920 }
921
922 a.Bind(&if_customhandler);
923 {
924 Node* const maybe_exception = a.CallJS(call_callable, context, on_reject,
925 a.UndefinedConstant(), exception);
926 // This doesn't do anything
927 a.GotoIfException(maybe_exception, &out, &var_unused);
928 a.Goto(&out);
Igor Sheludko 2016/12/13 23:09:00 Same here.
gsathya 2016/12/13 23:51:03 Done.
929 }
930
931 a.Bind(&out);
932 a.Return(a.UndefinedConstant());
933 }
934
935 void Builtins::Generate_PromiseHandle(compiler::CodeAssemblerState* state) {
936 CodeStubAssembler a(state);
937 typedef compiler::Node Node;
938 typedef CodeStubAssembler::Label Label;
939 typedef CodeStubAssembler::Variable Variable;
940
941 Node* const value = a.Parameter(1);
942 Node* const handler = a.Parameter(2);
943 Node* const deferred = a.Parameter(3);
944 Node* const context = a.Parameter(6);
945 Isolate* isolate = a.isolate();
946
947 // Get promise from deferred
948 Callable getproperty_callable = CodeFactory::GetProperty(isolate);
949 Node* const key =
950 a.HeapConstant(isolate->factory()->NewStringFromAsciiChecked("promise"));
Igor Sheludko 2016/12/13 23:09:00 The lookup will work faster if you create an inter
gsathya 2016/12/13 23:51:03 Done.
951 Node* const promise =
952 a.CallStub(getproperty_callable, context, deferred, key);
953
954 Variable var_reason(&a, MachineRepresentation::kTagged);
955
956 Node* const is_debug_active = a.IsDebugActive();
957 Label run_handler(&a), if_rejectpromise(&a), debug_push(&a, Label::kDeferred),
958 debug_pop(&a, Label::kDeferred);
959 a.Branch(is_debug_active, &debug_push, &run_handler);
960
961 a.Bind(&debug_push);
962 {
963 a.CallRuntime(Runtime::kDebugPushPromise, context, promise);
964 a.Goto(&run_handler);
965 }
966
967 a.Bind(&run_handler);
968 {
969 Callable call_callable = CodeFactory::Call(isolate);
970
971 Node* const result =
972 a.CallJS(call_callable, context, handler, a.UndefinedConstant(), value);
973
974 a.GotoIfException(result, &if_rejectpromise, &var_reason);
975
976 Node* const key = a.HeapConstant(
977 isolate->factory()->NewStringFromAsciiChecked("resolve"));
Igor Sheludko 2016/12/13 23:09:00 Same here.
gsathya 2016/12/13 23:51:02 Done.
978 Node* const on_resolve =
979 a.CallStub(getproperty_callable, context, deferred, key);
980
981 Label if_internalhandler(&a), if_customhandler(&a, Label::kDeferred);
982 a.Branch(a.IsUndefined(on_resolve), &if_internalhandler, &if_customhandler);
983
984 a.Bind(&if_internalhandler);
985 InternalResolvePromise(&a, context, promise, result, &debug_pop);
986
987 a.Bind(&if_customhandler);
988 {
989 Node* const maybe_exception = a.CallJS(call_callable, context, on_resolve,
990 a.UndefinedConstant(), result);
991 a.GotoIfException(maybe_exception, &if_rejectpromise, &var_reason);
992 a.Goto(&debug_pop);
993 }
994 }
995
996 a.Bind(&if_rejectpromise);
997 {
998 Node* const key =
999 a.HeapConstant(isolate->factory()->NewStringFromAsciiChecked("reject"));
1000 Node* const on_reject =
1001 a.CallStub(getproperty_callable, context, deferred, key);
1002
1003 Callable promise_handle_reject = CodeFactory::PromiseHandleReject(isolate);
1004 a.CallStub(promise_handle_reject, context, promise, on_reject,
1005 var_reason.value());
1006 a.Goto(&debug_pop);
1007 }
1008
1009 a.Bind(&debug_pop);
1010 {
1011 Label out(&a);
1012
1013 a.GotoUnless(is_debug_active, &out);
1014 a.CallRuntime(Runtime::kDebugPopPromise, context);
1015 a.Goto(&out);
1016
1017 a.Bind(&out);
1018 a.Return(a.UndefinedConstant());
1019 }
1020 }
1021
895 } // namespace internal 1022 } // namespace internal
896 } // namespace v8 1023 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698