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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/debug/debug.h" | 7 #include "src/debug/debug.h" |
8 #include "src/elements.h" | 8 #include "src/elements.h" |
| 9 #include "src/promise-utils.h" |
9 | 10 |
10 namespace v8 { | 11 namespace v8 { |
11 namespace internal { | 12 namespace internal { |
12 | 13 |
13 namespace { | 14 namespace { |
14 | 15 |
15 void PromiseRejectEvent(Isolate* isolate, Handle<JSReceiver> promise, | 16 void PromiseRejectEvent(Isolate* isolate, Handle<JSReceiver> promise, |
16 Handle<Object> rejected_promise, Handle<Object> value, | 17 Handle<Object> rejected_promise, Handle<Object> value, |
17 bool debug_event) { | 18 bool debug_event) { |
18 if (isolate->debug()->is_active() && debug_event) { | 19 if (isolate->debug()->is_active() && debug_event) { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); | 133 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); |
133 CONVERT_ARG_HANDLE_CHECKED(Object, tasks, 1); | 134 CONVERT_ARG_HANDLE_CHECKED(Object, tasks, 1); |
134 CONVERT_ARG_HANDLE_CHECKED(Object, deferred, 2); | 135 CONVERT_ARG_HANDLE_CHECKED(Object, deferred, 2); |
135 CONVERT_ARG_HANDLE_CHECKED(Object, status, 3); | 136 CONVERT_ARG_HANDLE_CHECKED(Object, status, 3); |
136 EnqueuePromiseReactionJob(isolate, value, tasks, deferred, status); | 137 EnqueuePromiseReactionJob(isolate, value, tasks, deferred, status); |
137 return isolate->heap()->undefined_value(); | 138 return isolate->heap()->undefined_value(); |
138 } | 139 } |
139 | 140 |
140 RUNTIME_FUNCTION(Runtime_EnqueuePromiseResolveThenableJob) { | 141 RUNTIME_FUNCTION(Runtime_EnqueuePromiseResolveThenableJob) { |
141 HandleScope scope(isolate); | 142 HandleScope scope(isolate); |
142 DCHECK(args.length() == 4); | 143 DCHECK(args.length() == 3); |
143 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, resolution, 0); | 144 CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0); |
144 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, then, 1); | 145 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, resolution, 1); |
145 CONVERT_ARG_HANDLE_CHECKED(JSFunction, resolve, 2); | 146 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, then, 2); |
146 CONVERT_ARG_HANDLE_CHECKED(JSFunction, reject, 3); | 147 |
147 Handle<Object> debug_id; | 148 // TODO(gsathya): Add fast path for native promises with unmodified |
148 Handle<Object> debug_name; | 149 // PromiseThen (which don't need these resolving functions, but |
| 150 // instead can just call resolve/reject directly). |
| 151 Handle<JSFunction> resolve, reject; |
| 152 PromiseUtils::CreateResolvingFunctions( |
| 153 isolate, promise, isolate->factory()->false_value(), &resolve, &reject); |
| 154 |
| 155 Handle<Object> debug_id, debug_name; |
149 if (isolate->debug()->is_active()) { | 156 if (isolate->debug()->is_active()) { |
150 debug_id = | 157 debug_id = |
151 handle(Smi::FromInt(isolate->GetNextDebugMicrotaskId()), isolate); | 158 handle(Smi::FromInt(isolate->GetNextDebugMicrotaskId()), isolate); |
152 debug_name = isolate->factory()->PromiseResolveThenableJob_string(); | 159 debug_name = isolate->factory()->PromiseResolveThenableJob_string(); |
153 isolate->debug()->OnAsyncTaskEvent(isolate->factory()->enqueue_string(), | 160 isolate->debug()->OnAsyncTaskEvent(isolate->factory()->enqueue_string(), |
154 debug_id, | 161 debug_id, |
155 Handle<String>::cast(debug_name)); | 162 Handle<String>::cast(debug_name)); |
156 } else { | 163 } else { |
157 debug_id = isolate->factory()->undefined_value(); | 164 debug_id = isolate->factory()->undefined_value(); |
158 debug_name = isolate->factory()->undefined_value(); | 165 debug_name = isolate->factory()->undefined_value(); |
159 } | 166 } |
| 167 |
160 Handle<PromiseResolveThenableJobInfo> info = | 168 Handle<PromiseResolveThenableJobInfo> info = |
161 isolate->factory()->NewPromiseResolveThenableJobInfo( | 169 isolate->factory()->NewPromiseResolveThenableJobInfo( |
162 resolution, then, resolve, reject, debug_id, debug_name); | 170 resolution, then, resolve, reject, debug_id, debug_name, |
| 171 isolate->native_context()); |
163 isolate->EnqueueMicrotask(info); | 172 isolate->EnqueueMicrotask(info); |
| 173 |
164 return isolate->heap()->undefined_value(); | 174 return isolate->heap()->undefined_value(); |
165 } | 175 } |
166 | 176 |
167 RUNTIME_FUNCTION(Runtime_EnqueueMicrotask) { | 177 RUNTIME_FUNCTION(Runtime_EnqueueMicrotask) { |
168 HandleScope scope(isolate); | 178 HandleScope scope(isolate); |
169 DCHECK(args.length() == 1); | 179 DCHECK(args.length() == 1); |
170 CONVERT_ARG_HANDLE_CHECKED(JSFunction, microtask, 0); | 180 CONVERT_ARG_HANDLE_CHECKED(JSFunction, microtask, 0); |
171 isolate->EnqueueMicrotask(microtask); | 181 isolate->EnqueueMicrotask(microtask); |
172 return isolate->heap()->undefined_value(); | 182 return isolate->heap()->undefined_value(); |
173 } | 183 } |
174 | 184 |
175 RUNTIME_FUNCTION(Runtime_RunMicrotasks) { | 185 RUNTIME_FUNCTION(Runtime_RunMicrotasks) { |
176 HandleScope scope(isolate); | 186 HandleScope scope(isolate); |
177 DCHECK(args.length() == 0); | 187 DCHECK(args.length() == 0); |
178 isolate->RunMicrotasks(); | 188 isolate->RunMicrotasks(); |
179 return isolate->heap()->undefined_value(); | 189 return isolate->heap()->undefined_value(); |
180 } | 190 } |
181 | 191 |
182 } // namespace internal | 192 } // namespace internal |
183 } // namespace v8 | 193 } // namespace v8 |
OLD | NEW |