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

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

Issue 2497523002: [promises] Move promise constructor to TFS (Closed)
Patch Set: remove temp code Created 4 years, 1 month 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 7
8 #include "src/code-factory.h"
8 #include "src/promise-utils.h" 9 #include "src/promise-utils.h"
9 10
10 namespace v8 { 11 namespace v8 {
11 namespace internal { 12 namespace internal {
12 13
13 // ES#sec-promise-resolve-functions 14 // ES#sec-promise-resolve-functions
14 // Promise Resolve Functions 15 // Promise Resolve Functions
15 BUILTIN(PromiseResolveClosure) { 16 BUILTIN(PromiseResolveClosure) {
16 HandleScope scope(isolate); 17 HandleScope scope(isolate);
17 18
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 62
62 // ES#sec-createresolvingfunctions 63 // ES#sec-createresolvingfunctions
63 // CreateResolvingFunctions ( promise ) 64 // CreateResolvingFunctions ( promise )
64 BUILTIN(CreateResolvingFunctions) { 65 BUILTIN(CreateResolvingFunctions) {
65 HandleScope scope(isolate); 66 HandleScope scope(isolate);
66 DCHECK_EQ(3, args.length()); 67 DCHECK_EQ(3, args.length());
67 68
68 Handle<JSObject> promise = args.at<JSObject>(1); 69 Handle<JSObject> promise = args.at<JSObject>(1);
69 Handle<Object> debug_event = args.at<Object>(2); 70 Handle<Object> debug_event = args.at<Object>(2);
70 Handle<JSFunction> resolve, reject; 71 Handle<JSFunction> resolve, reject;
71
72 PromiseUtils::CreateResolvingFunctions(isolate, promise, debug_event, 72 PromiseUtils::CreateResolvingFunctions(isolate, promise, debug_event,
73 &resolve, &reject); 73 &resolve, &reject);
74 74
75 Handle<FixedArray> result = isolate->factory()->NewFixedArray(2); 75 Handle<FixedArray> result = isolate->factory()->NewFixedArray(2);
76 result->set(0, *resolve); 76 result->set(0, *resolve);
77 result->set(1, *reject); 77 result->set(1, *reject);
78 78
79 return *isolate->factory()->NewJSArrayWithElements(result, FAST_ELEMENTS, 2, 79 return *isolate->factory()->NewJSArrayWithElements(result, FAST_ELEMENTS, 2,
80 NOT_TENURED); 80 NOT_TENURED);
81 } 81 }
82 82
83 // TODO(gsathya): Set up catch prediction
84 void Builtins::Generate_PromiseConstructor(CodeStubAssembler* a) {
85 typedef CodeStubAssembler::Variable Variable;
86 typedef CodeStubAssembler::Label Label;
87 typedef compiler::Node Node;
88
89 Node* const executor = a->Parameter(1);
90 Node* const new_target = a->Parameter(2);
91 Node* const context = a->Parameter(4);
92 Isolate* isolate = a->isolate();
93
94 Variable result(a, MachineRepresentation::kTagged),
jgruber 2016/11/11 08:05:19 Nit: The naming convention used elsewhere is to pr
gsathya 2016/11/22 04:31:43 Done.
95 reason(a, MachineRepresentation::kTagged);
96 Label if_targetisnotundefined(a), if_targetisundefined(a, Label::kDeferred);
97
98 a->Branch(a->WordEqual(new_target, a->UndefinedConstant()),
Benedikt Meurer 2016/11/11 06:50:31 Instead of dynamically checking that new.target is
gsathya 2016/11/22 04:31:43 The asm wrapper is set as the construct stub, whic
99 &if_targetisundefined, &if_targetisnotundefined);
100
101 // 1. If NewTarget is undefined, throw a TypeError exception.
102 a->Bind(&if_targetisundefined);
103 {
104 Node* const message_id =
105 a->SmiConstant(Smi::FromInt(MessageTemplate::kNotAPromise));
106 Callable callable = CodeFactory::ToString(isolate);
107 // calling toString on UndefinedConstant?
jgruber 2016/11/11 08:05:19 You probably don't need to call ToString here, jus
gsathya 2016/11/22 04:31:43 Done.
108 Node* const undefined_str = a->CallStub(callable, context, new_target);
109
110 a->CallRuntime(Runtime::kThrowTypeError, context, message_id,
111 undefined_str);
112 a->Return(a->UndefinedConstant()); // Never reached.
113 }
114
115 a->Bind(&if_targetisnotundefined);
116 {
117 Node* const executor_map = a->LoadMap(executor);
118 Label if_iscallable(a), if_notcallable(a, Label::kDeferred),
119 if_rejectpromise(a, Label::kDeferred);
120 a->Branch(a->IsCallableMap(executor_map), &if_iscallable, &if_notcallable);
121
122 // 2. If IsCallable(executor) is false, throw a TypeError exception.
123 a->Bind(&if_notcallable);
124 {
125 Node* const message_id =
126 a->SmiConstant(Smi::FromInt(MessageTemplate::kResolverNotAFunction));
127 Callable callable = CodeFactory::ToString(isolate);
jgruber 2016/11/11 09:25:43 Danno added ToString to CSA recently, so all CodeF
gsathya 2016/11/22 04:31:43 Done.
128 Node* const executor_str = a->CallStub(callable, context, executor);
129
130 a->CallRuntime(Runtime::kThrowTypeError, context, message_id,
131 executor_str);
132 a->Return(a->UndefinedConstant()); // Never reached.
133 }
134
135 a->Bind(&if_iscallable);
136 {
137 Node* const native_context = a->LoadNativeContext(context);
138 Node* const promise_fun = a->LoadContextElement(
139 native_context, Context::PROMISE_FUNCTION_INDEX);
140 Node* const initial_map = a->LoadObjectField(
141 promise_fun, JSFunction::kPrototypeOrInitialMapOffset);
142
143 // TODO(gsathya): check if target != new_target
144 Node* const instance = a->AllocateJSObjectFromMap(initial_map);
145 result.Bind(instance);
146
147 Node* const resolving_functions =
148 a->CallRuntime(Runtime::kCreateResolvingFunctions, context, instance);
gsathya 2016/11/11 02:48:18 Is there a way to call a C++ builtin from TFJ? Set
Benedikt Meurer 2016/11/11 06:50:31 The runtime function is the correct approach here.
149
150 Callable call_callable = CodeFactory::Call(isolate);
151
152 // TODO(gsathya): Extract resolving functions from JSArray
jgruber 2016/11/11 08:05:19 Once all calls to CreateResolvingFunctions are in
gsathya 2016/11/22 04:31:43 Moved to a FixedArray for now. Next step is to mov
153 Node* const maybe_exception =
154 a->CallJS(call_callable, context, executor, a->UndefinedConstant(),
155 resolving_functions);
156
157 a->GotoIfException(maybe_exception, &if_rejectpromise, &reason);
158 a->Return(result.value());
159 }
160
161 // TODO(gsathya): Reject the promise
162 a->Bind(&if_rejectpromise);
163 { a->Return(result.value()); }
jgruber 2016/11/11 08:05:19 Nit: You can remove these braces.
gsathya 2016/11/22 04:31:43 Done.
164 }
165 }
83 } // namespace internal 166 } // namespace internal
84 } // namespace v8 167 } // namespace v8
OLDNEW
« src/bootstrapper.cc ('K') | « src/builtins/builtins.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698