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

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

Issue 2578923002: [inspector] async stacks for Promise.then calls... (Closed)
Patch Set: added missing handle scope 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 #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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 Handle<Object> deferred, Handle<Object> status) { 62 Handle<Object> deferred, Handle<Object> status) {
63 Handle<Object> debug_id = isolate->factory()->undefined_value(); 63 Handle<Object> debug_id = isolate->factory()->undefined_value();
64 Handle<Object> debug_name = isolate->factory()->undefined_value(); 64 Handle<Object> debug_name = isolate->factory()->undefined_value();
65 if (isolate->debug()->is_active()) { 65 if (isolate->debug()->is_active()) {
66 MaybeHandle<Object> maybe_result; 66 MaybeHandle<Object> maybe_result;
67 Handle<Object> deferred_obj(deferred); 67 Handle<Object> deferred_obj(deferred);
68 68
69 if (deferred->IsFixedArray()) { 69 if (deferred->IsFixedArray()) {
70 deferred_obj = isolate->factory()->undefined_value(); 70 deferred_obj = isolate->factory()->undefined_value();
71 } 71 }
72 72 Handle<Object> argv[] = {deferred_obj, status,
73 Handle<Object> argv[] = {deferred_obj, status}; 73 isolate->debug()->NextAsyncTaskId(promise)};
74 maybe_result = Execution::TryCall( 74 maybe_result = Execution::TryCall(
75 isolate, isolate->promise_debug_get_info(), 75 isolate, isolate->promise_debug_get_info(),
76 isolate->factory()->undefined_value(), arraysize(argv), argv); 76 isolate->factory()->undefined_value(), arraysize(argv), argv);
77 77
78 Handle<Object> result; 78 Handle<Object> result;
79 if ((maybe_result).ToHandle(&result)) { 79 if ((maybe_result).ToHandle(&result)) {
80 CHECK(result->IsJSArray()); 80 CHECK(result->IsJSArray());
81 Handle<JSArray> array = Handle<JSArray>::cast(result); 81 Handle<JSArray> array = Handle<JSArray>::cast(result);
82 ElementsAccessor* accessor = array->GetElementsAccessor(); 82 ElementsAccessor* accessor = array->GetElementsAccessor();
83 DCHECK(accessor->HasElement(array, 0)); 83 DCHECK(accessor->HasElement(array, 0));
(...skipping 13 matching lines...) Expand all
97 Handle<Object> result) { 97 Handle<Object> result) {
98 promise->set_status(status); 98 promise->set_status(status);
99 promise->set_result(*result); 99 promise->set_result(*result);
100 promise->set_deferred(isolate->heap()->undefined_value()); 100 promise->set_deferred(isolate->heap()->undefined_value());
101 promise->set_fulfill_reactions(isolate->heap()->undefined_value()); 101 promise->set_fulfill_reactions(isolate->heap()->undefined_value());
102 promise->set_reject_reactions(isolate->heap()->undefined_value()); 102 promise->set_reject_reactions(isolate->heap()->undefined_value());
103 } 103 }
104 104
105 void PromiseFulfill(Isolate* isolate, Handle<JSPromise> promise, 105 void PromiseFulfill(Isolate* isolate, Handle<JSPromise> promise,
106 Handle<Smi> status, Handle<Object> value) { 106 Handle<Smi> status, Handle<Object> value) {
107 if (isolate->debug()->is_active()) {
108 isolate->debug()->OnAsyncTaskEvent(
109 debug::EnqueueRecurring, isolate->debug()->NextAsyncTaskId(promise),
110 status->value() == kPromiseFulfilled
111 ? isolate->factory()->PromiseResolve_string()
112 : isolate->factory()->PromiseReject_string());
113 }
114
107 // Check if there are any callbacks. 115 // Check if there are any callbacks.
108 if (!promise->deferred()->IsUndefined(isolate)) { 116 if (!promise->deferred()->IsUndefined(isolate)) {
109 Handle<Object> tasks((status->value() == kPromiseFulfilled) 117 Handle<Object> tasks((status->value() == kPromiseFulfilled)
110 ? promise->fulfill_reactions() 118 ? promise->fulfill_reactions()
111 : promise->reject_reactions(), 119 : promise->reject_reactions(),
112 isolate); 120 isolate);
113 Handle<Object> deferred(promise->deferred(), isolate); 121 Handle<Object> deferred(promise->deferred(), isolate);
114 EnqueuePromiseReactionJob(isolate, promise, value, tasks, deferred, status); 122 EnqueuePromiseReactionJob(isolate, promise, value, tasks, deferred, status);
115 } 123 }
116 124
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 172
165 // TODO(gsathya): Add fast path for native promises with unmodified 173 // TODO(gsathya): Add fast path for native promises with unmodified
166 // PromiseThen (which don't need these resolving functions, but 174 // PromiseThen (which don't need these resolving functions, but
167 // instead can just call resolve/reject directly). 175 // instead can just call resolve/reject directly).
168 Handle<JSFunction> resolve, reject; 176 Handle<JSFunction> resolve, reject;
169 PromiseUtils::CreateResolvingFunctions( 177 PromiseUtils::CreateResolvingFunctions(
170 isolate, promise, isolate->factory()->false_value(), &resolve, &reject); 178 isolate, promise, isolate->factory()->false_value(), &resolve, &reject);
171 179
172 Handle<Object> debug_id, debug_name; 180 Handle<Object> debug_id, debug_name;
173 if (isolate->debug()->is_active()) { 181 if (isolate->debug()->is_active()) {
174 debug_id = 182 debug_id = isolate->debug()->NextAsyncTaskId(promise);
175 handle(Smi::FromInt(isolate->GetNextDebugMicrotaskId()), isolate);
176 debug_name = isolate->factory()->PromiseResolveThenableJob_string(); 183 debug_name = isolate->factory()->PromiseResolveThenableJob_string();
177 isolate->debug()->OnAsyncTaskEvent(isolate->factory()->enqueue_string(),
178 debug_id,
179 Handle<String>::cast(debug_name));
180 } else { 184 } else {
181 debug_id = isolate->factory()->undefined_value(); 185 debug_id = isolate->factory()->undefined_value();
182 debug_name = isolate->factory()->undefined_value(); 186 debug_name = isolate->factory()->undefined_value();
183 } 187 }
184 188
185 Handle<PromiseResolveThenableJobInfo> info = 189 Handle<PromiseResolveThenableJobInfo> info =
186 isolate->factory()->NewPromiseResolveThenableJobInfo( 190 isolate->factory()->NewPromiseResolveThenableJobInfo(
187 resolution, then, resolve, reject, debug_id, debug_name, 191 resolution, then, resolve, reject, debug_id, debug_name,
188 isolate->native_context()); 192 isolate->native_context());
189 isolate->EnqueueMicrotask(info); 193 isolate->EnqueueMicrotask(info);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 HandleScope scope(isolate); 283 HandleScope scope(isolate);
280 DCHECK(args.length() == 1); 284 DCHECK(args.length() == 1);
281 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 285 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
282 286
283 promise->set_has_handler(true); 287 promise->set_has_handler(true);
284 return isolate->heap()->undefined_value(); 288 return isolate->heap()->undefined_value();
285 } 289 }
286 290
287 } // namespace internal 291 } // namespace internal
288 } // namespace v8 292 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698