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 #include "src/runtime/runtime-utils.h" | 4 #include "src/runtime/runtime-utils.h" |
5 | 5 |
6 #include "src/debug/debug.h" | 6 #include "src/debug/debug.h" |
7 #include "src/elements.h" | 7 #include "src/elements.h" |
8 #include "src/promise-utils.h" | 8 #include "src/promise-utils.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 25 matching lines...) Expand all Loading... | |
36 HandleScope scope(isolate); | 36 HandleScope scope(isolate); |
37 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); | 37 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); |
38 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); | 38 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); |
39 | 39 |
40 Handle<Object> rejected_promise = promise; | 40 Handle<Object> rejected_promise = promise; |
41 if (isolate->debug()->is_active()) { | 41 if (isolate->debug()->is_active()) { |
42 // If the Promise.reject call is caught, then this will return | 42 // If the Promise.reject call is caught, then this will return |
43 // undefined, which will be interpreted by PromiseRejectEvent | 43 // undefined, which will be interpreted by PromiseRejectEvent |
44 // as being a caught exception event. | 44 // as being a caught exception event. |
45 rejected_promise = isolate->GetPromiseOnStackOnThrow(); | 45 rejected_promise = isolate->GetPromiseOnStackOnThrow(); |
46 isolate->debug()->OnAsyncTaskEvent( | |
47 debug::kDebugEnqueueRecurring, | |
48 isolate->debug()->NextAsyncTaskId(promise), kDebugPromiseReject); | |
46 } | 49 } |
47 PromiseRejectEvent(isolate, promise, rejected_promise, value, true); | 50 PromiseRejectEvent(isolate, promise, rejected_promise, value, true); |
48 return isolate->heap()->undefined_value(); | 51 return isolate->heap()->undefined_value(); |
49 } | 52 } |
50 | 53 |
51 RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) { | 54 RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) { |
52 DCHECK_EQ(1, args.length()); | 55 DCHECK_EQ(1, args.length()); |
53 HandleScope scope(isolate); | 56 HandleScope scope(isolate); |
54 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); | 57 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); |
55 // At this point, no revocation has been issued before | 58 // At this point, no revocation has been issued before |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
100 | 103 |
101 // id can be Undefined or Smi. | 104 // id can be Undefined or Smi. |
102 if (!id->IsSmi()) { | 105 if (!id->IsSmi()) { |
103 return false; | 106 return false; |
104 } | 107 } |
105 | 108 |
106 *debug_id = Handle<Smi>::cast(id)->value(); | 109 *debug_id = Handle<Smi>::cast(id)->value(); |
107 return true; | 110 return true; |
108 } | 111 } |
109 | 112 |
110 void SetDebugInfo(Isolate* isolate, Handle<PromiseReactionJobInfo> info, | 113 void SetDebugInfo(Isolate* isolate, Handle<PromiseReactionJobInfo> info, |
gsathya
2017/01/09 19:24:35
info->promise() == promise right? can we just reus
kozy
2017/01/10 00:11:38
Done.
| |
111 int status) { | 114 Handle<JSPromise> promise, int status) { |
112 int id; | 115 int id; |
113 PromiseDebugActionName name; | 116 PromiseDebugActionName name; |
114 | 117 |
115 if (GetDebugIdForAsyncFunction(isolate, info, &id)) { | 118 if (GetDebugIdForAsyncFunction(isolate, info, &id)) { |
116 name = kDebugAsyncFunction; | 119 name = kDebugAsyncFunction; |
117 } else { | 120 } else { |
118 id = isolate->GetNextDebugMicrotaskId(); | 121 id = isolate->debug()->NextAsyncTaskId(promise); |
119 | |
120 DCHECK(status != v8::Promise::kPending); | 122 DCHECK(status != v8::Promise::kPending); |
121 name = status == v8::Promise::kFulfilled ? kDebugPromiseResolve | 123 name = status == v8::Promise::kFulfilled ? kDebugPromiseResolve |
122 : kDebugPromiseReject; | 124 : kDebugPromiseReject; |
123 | |
124 isolate->debug()->OnAsyncTaskEvent(kDebugEnqueue, id, name); | |
125 } | 125 } |
126 | 126 |
127 info->set_debug_id(id); | 127 info->set_debug_id(id); |
128 info->set_debug_name(name); | 128 info->set_debug_name(name); |
129 } | 129 } |
130 | 130 |
131 void EnqueuePromiseReactionJob(Isolate* isolate, | 131 void EnqueuePromiseReactionJob(Isolate* isolate, |
132 Handle<PromiseReactionJobInfo> info, | 132 Handle<PromiseReactionJobInfo> info, |
133 int status) { | 133 Handle<JSPromise> promise, int status) { |
134 if (isolate->debug()->is_active()) { | 134 if (isolate->debug()->is_active()) { |
135 SetDebugInfo(isolate, info, status); | 135 SetDebugInfo(isolate, info, promise, status); |
136 } | 136 } |
137 | 137 |
138 isolate->EnqueueMicrotask(info); | 138 isolate->EnqueueMicrotask(info); |
139 } | 139 } |
140 | 140 |
141 void PromiseSet(Isolate* isolate, Handle<JSPromise> promise, int status, | 141 void PromiseSet(Isolate* isolate, Handle<JSPromise> promise, int status, |
142 Handle<Object> result) { | 142 Handle<Object> result) { |
143 promise->set_status(status); | 143 promise->set_status(status); |
144 promise->set_result(*result); | 144 promise->set_result(*result); |
145 promise->set_deferred_promise(isolate->heap()->undefined_value()); | 145 promise->set_deferred_promise(isolate->heap()->undefined_value()); |
146 promise->set_deferred_on_resolve(isolate->heap()->undefined_value()); | 146 promise->set_deferred_on_resolve(isolate->heap()->undefined_value()); |
147 promise->set_deferred_on_reject(isolate->heap()->undefined_value()); | 147 promise->set_deferred_on_reject(isolate->heap()->undefined_value()); |
148 promise->set_fulfill_reactions(isolate->heap()->undefined_value()); | 148 promise->set_fulfill_reactions(isolate->heap()->undefined_value()); |
149 promise->set_reject_reactions(isolate->heap()->undefined_value()); | 149 promise->set_reject_reactions(isolate->heap()->undefined_value()); |
150 } | 150 } |
151 | 151 |
152 void PromiseFulfill(Isolate* isolate, Handle<JSPromise> promise, int status, | 152 void PromiseFulfill(Isolate* isolate, Handle<JSPromise> promise, int status, |
153 Handle<Object> value) { | 153 Handle<Object> value) { |
154 if (isolate->debug()->is_active()) { | |
155 isolate->debug()->OnAsyncTaskEvent( | |
156 debug::kDebugEnqueueRecurring, | |
157 isolate->debug()->NextAsyncTaskId(promise), | |
158 status == v8::Promise::kFulfilled ? kDebugPromiseResolve | |
159 : kDebugPromiseReject); | |
160 } | |
154 // Check if there are any callbacks. | 161 // Check if there are any callbacks. |
155 if (!promise->deferred_promise()->IsUndefined(isolate)) { | 162 if (!promise->deferred_promise()->IsUndefined(isolate)) { |
156 Handle<Object> tasks((status == v8::Promise::kFulfilled) | 163 Handle<Object> tasks((status == v8::Promise::kFulfilled) |
157 ? promise->fulfill_reactions() | 164 ? promise->fulfill_reactions() |
158 : promise->reject_reactions(), | 165 : promise->reject_reactions(), |
159 isolate); | 166 isolate); |
160 Handle<PromiseReactionJobInfo> info = | 167 Handle<PromiseReactionJobInfo> info = |
161 isolate->factory()->NewPromiseReactionJobInfo( | 168 isolate->factory()->NewPromiseReactionJobInfo( |
162 promise, value, tasks, handle(promise->deferred_promise(), isolate), | 169 promise, value, tasks, handle(promise->deferred_promise(), isolate), |
163 handle(promise->deferred_on_resolve(), isolate), | 170 handle(promise->deferred_on_resolve(), isolate), |
164 handle(promise->deferred_on_reject(), isolate), | 171 handle(promise->deferred_on_reject(), isolate), |
165 isolate->native_context()); | 172 isolate->native_context()); |
166 EnqueuePromiseReactionJob(isolate, info, status); | 173 EnqueuePromiseReactionJob(isolate, info, promise, status); |
167 } | 174 } |
168 | 175 |
169 PromiseSet(isolate, promise, status, value); | 176 PromiseSet(isolate, promise, status, value); |
170 } | 177 } |
171 | 178 |
172 } // namespace | 179 } // namespace |
173 | 180 |
174 RUNTIME_FUNCTION(Runtime_PromiseReject) { | 181 RUNTIME_FUNCTION(Runtime_PromiseReject) { |
175 DCHECK_EQ(3, args.length()); | 182 DCHECK_EQ(3, args.length()); |
176 HandleScope scope(isolate); | 183 HandleScope scope(isolate); |
177 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); | 184 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); |
178 CONVERT_ARG_HANDLE_CHECKED(Object, reason, 1); | 185 CONVERT_ARG_HANDLE_CHECKED(Object, reason, 1); |
179 CONVERT_BOOLEAN_ARG_CHECKED(debug_event, 2); | 186 CONVERT_BOOLEAN_ARG_CHECKED(debug_event, 2); |
180 | 187 |
181 PromiseRejectEvent(isolate, promise, promise, reason, debug_event); | 188 PromiseRejectEvent(isolate, promise, promise, reason, debug_event); |
182 PromiseFulfill(isolate, promise, v8::Promise::kRejected, reason); | 189 PromiseFulfill(isolate, promise, v8::Promise::kRejected, reason); |
183 | 190 |
184 return isolate->heap()->undefined_value(); | 191 return isolate->heap()->undefined_value(); |
185 } | 192 } |
186 | 193 |
187 RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) { | 194 RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) { |
188 HandleScope scope(isolate); | 195 HandleScope scope(isolate); |
189 DCHECK_EQ(2, args.length()); | 196 DCHECK_EQ(3, args.length()); |
190 CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 0); | 197 CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 0); |
191 CONVERT_SMI_ARG_CHECKED(status, 1); | 198 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 1); |
192 EnqueuePromiseReactionJob(isolate, info, status); | 199 CONVERT_SMI_ARG_CHECKED(status, 2); |
200 EnqueuePromiseReactionJob(isolate, info, promise, status); | |
193 return isolate->heap()->undefined_value(); | 201 return isolate->heap()->undefined_value(); |
194 } | 202 } |
195 | 203 |
196 RUNTIME_FUNCTION(Runtime_EnqueuePromiseResolveThenableJob) { | 204 RUNTIME_FUNCTION(Runtime_EnqueuePromiseResolveThenableJob) { |
197 HandleScope scope(isolate); | 205 HandleScope scope(isolate); |
198 DCHECK(args.length() == 1); | 206 DCHECK(args.length() == 1); |
199 CONVERT_ARG_HANDLE_CHECKED(PromiseResolveThenableJobInfo, info, 0); | 207 CONVERT_ARG_HANDLE_CHECKED(PromiseResolveThenableJobInfo, info, 0); |
200 isolate->EnqueueMicrotask(info); | 208 isolate->EnqueueMicrotask(info); |
201 return isolate->heap()->undefined_value(); | 209 return isolate->heap()->undefined_value(); |
202 } | 210 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
280 HandleScope scope(isolate); | 288 HandleScope scope(isolate); |
281 DCHECK_EQ(1, args.length()); | 289 DCHECK_EQ(1, args.length()); |
282 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); | 290 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); |
283 isolate->RunPromiseHook(PromiseHookType::kAfter, promise, | 291 isolate->RunPromiseHook(PromiseHookType::kAfter, promise, |
284 isolate->factory()->undefined_value()); | 292 isolate->factory()->undefined_value()); |
285 return isolate->heap()->undefined_value(); | 293 return isolate->heap()->undefined_value(); |
286 } | 294 } |
287 | 295 |
288 } // namespace internal | 296 } // namespace internal |
289 } // namespace v8 | 297 } // namespace v8 |
OLD | NEW |