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

Side by Side Diff: src/debug.cc

Issue 462413003: Move Promise tracking from debug to isolate. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: move assertions Created 6 years, 4 months 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 | Annotate | Revision Log
« no previous file with comments | « src/debug.h ('k') | src/isolate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 thread_local_.last_step_action_ = StepNone; 561 thread_local_.last_step_action_ = StepNone;
562 thread_local_.last_statement_position_ = RelocInfo::kNoPosition; 562 thread_local_.last_statement_position_ = RelocInfo::kNoPosition;
563 thread_local_.step_count_ = 0; 563 thread_local_.step_count_ = 0;
564 thread_local_.last_fp_ = 0; 564 thread_local_.last_fp_ = 0;
565 thread_local_.queued_step_count_ = 0; 565 thread_local_.queued_step_count_ = 0;
566 thread_local_.step_into_fp_ = 0; 566 thread_local_.step_into_fp_ = 0;
567 thread_local_.step_out_fp_ = 0; 567 thread_local_.step_out_fp_ = 0;
568 // TODO(isolates): frames_are_dropped_? 568 // TODO(isolates): frames_are_dropped_?
569 thread_local_.current_debug_scope_ = NULL; 569 thread_local_.current_debug_scope_ = NULL;
570 thread_local_.restarter_frame_function_pointer_ = NULL; 570 thread_local_.restarter_frame_function_pointer_ = NULL;
571 thread_local_.promise_on_stack_ = NULL;
572 } 571 }
573 572
574 573
575 char* Debug::ArchiveDebug(char* storage) { 574 char* Debug::ArchiveDebug(char* storage) {
576 char* to = storage; 575 char* to = storage;
577 MemCopy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal)); 576 MemCopy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal));
578 ThreadInit(); 577 ThreadInit();
579 return storage + ArchiveSpacePerThread(); 578 return storage + ArchiveSpacePerThread();
580 } 579 }
581 580
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 debug_context_ = Handle<Context>::cast( 847 debug_context_ = Handle<Context>::cast(
849 isolate_->global_handles()->Create(*context)); 848 isolate_->global_handles()->Create(*context));
850 return true; 849 return true;
851 } 850 }
852 851
853 852
854 void Debug::Unload() { 853 void Debug::Unload() {
855 ClearAllBreakPoints(); 854 ClearAllBreakPoints();
856 ClearStepping(); 855 ClearStepping();
857 856
858 // Match unmatched PopPromise calls.
859 while (thread_local_.promise_on_stack_) PopPromise();
860
861 // Return debugger is not loaded. 857 // Return debugger is not loaded.
862 if (!is_loaded()) return; 858 if (!is_loaded()) return;
863 859
864 // Clear the script cache. 860 // Clear the script cache.
865 if (script_cache_ != NULL) { 861 if (script_cache_ != NULL) {
866 delete script_cache_; 862 delete script_cache_;
867 script_cache_ = NULL; 863 script_cache_ = NULL;
868 } 864 }
869 865
870 // Clear debugger context global handle. 866 // Clear debugger context global handle.
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 1261
1266 bool Debug::IsBreakOnException(ExceptionBreakType type) { 1262 bool Debug::IsBreakOnException(ExceptionBreakType type) {
1267 if (type == BreakUncaughtException) { 1263 if (type == BreakUncaughtException) {
1268 return break_on_uncaught_exception_; 1264 return break_on_uncaught_exception_;
1269 } else { 1265 } else {
1270 return break_on_exception_; 1266 return break_on_exception_;
1271 } 1267 }
1272 } 1268 }
1273 1269
1274 1270
1275 PromiseOnStack::PromiseOnStack(Isolate* isolate, PromiseOnStack* prev,
1276 Handle<JSObject> promise)
1277 : isolate_(isolate), prev_(prev) {
1278 handler_ = StackHandler::FromAddress(
1279 Isolate::handler(isolate->thread_local_top()));
1280 promise_ =
1281 Handle<JSObject>::cast(isolate->global_handles()->Create(*promise));
1282 }
1283
1284
1285 PromiseOnStack::~PromiseOnStack() {
1286 isolate_->global_handles()->Destroy(
1287 Handle<Object>::cast(promise_).location());
1288 }
1289
1290
1291 void Debug::PushPromise(Handle<JSObject> promise) {
1292 PromiseOnStack* prev = thread_local_.promise_on_stack_;
1293 thread_local_.promise_on_stack_ = new PromiseOnStack(isolate_, prev, promise);
1294 }
1295
1296
1297 void Debug::PopPromise() {
1298 if (thread_local_.promise_on_stack_ == NULL) return;
1299 PromiseOnStack* prev = thread_local_.promise_on_stack_->prev();
1300 delete thread_local_.promise_on_stack_;
1301 thread_local_.promise_on_stack_ = prev;
1302 }
1303
1304
1305 Handle<Object> Debug::GetPromiseOnStackOnThrow() {
1306 Handle<Object> undefined = isolate_->factory()->undefined_value();
1307 if (thread_local_.promise_on_stack_ == NULL) return undefined;
1308 StackHandler* promise_try = thread_local_.promise_on_stack_->handler();
1309 // Find the top-most try-catch handler.
1310 StackHandler* handler = StackHandler::FromAddress(
1311 Isolate::handler(isolate_->thread_local_top()));
1312 do {
1313 if (handler == promise_try) {
1314 // Mark the pushed try-catch handler to prevent a later duplicate event
1315 // triggered with the following reject.
1316 return thread_local_.promise_on_stack_->promise();
1317 }
1318 handler = handler->next();
1319 // Throwing inside a Promise can be intercepted by an inner try-catch, so
1320 // we stop at the first try-catch handler.
1321 } while (handler != NULL && !handler->is_catch());
1322 return undefined;
1323 }
1324
1325
1326 bool Debug::PromiseHasRejectHandler(Handle<JSObject> promise) { 1271 bool Debug::PromiseHasRejectHandler(Handle<JSObject> promise) {
1327 Handle<JSFunction> fun = Handle<JSFunction>::cast( 1272 Handle<JSFunction> fun = Handle<JSFunction>::cast(
1328 JSObject::GetDataProperty(isolate_->js_builtins_object(), 1273 JSObject::GetDataProperty(isolate_->js_builtins_object(),
1329 isolate_->factory()->NewStringFromStaticAscii( 1274 isolate_->factory()->NewStringFromStaticAscii(
1330 "PromiseHasRejectHandler"))); 1275 "PromiseHasRejectHandler")));
1331 Handle<Object> result = 1276 Handle<Object> result =
1332 Execution::Call(isolate_, fun, promise, 0, NULL).ToHandleChecked(); 1277 Execution::Call(isolate_, fun, promise, 0, NULL).ToHandleChecked();
1333 return result->IsTrue(); 1278 return result->IsTrue();
1334 } 1279 }
1335 1280
(...skipping 1224 matching lines...) Expand 10 before | Expand all | Expand 10 after
2560 MaybeHandle<Object> Debug::MakeAsyncTaskEvent(Handle<JSObject> task_event) { 2505 MaybeHandle<Object> Debug::MakeAsyncTaskEvent(Handle<JSObject> task_event) {
2561 // Create the async task event object. 2506 // Create the async task event object.
2562 Handle<Object> argv[] = { task_event }; 2507 Handle<Object> argv[] = { task_event };
2563 return MakeJSObject("MakeAsyncTaskEvent", ARRAY_SIZE(argv), argv); 2508 return MakeJSObject("MakeAsyncTaskEvent", ARRAY_SIZE(argv), argv);
2564 } 2509 }
2565 2510
2566 2511
2567 void Debug::OnThrow(Handle<Object> exception, bool uncaught) { 2512 void Debug::OnThrow(Handle<Object> exception, bool uncaught) {
2568 if (in_debug_scope() || ignore_events()) return; 2513 if (in_debug_scope() || ignore_events()) return;
2569 HandleScope scope(isolate_); 2514 HandleScope scope(isolate_);
2570 OnException(exception, uncaught, GetPromiseOnStackOnThrow()); 2515 OnException(exception, uncaught, isolate_->GetPromiseOnStackOnThrow());
2571 } 2516 }
2572 2517
2573 2518
2574 void Debug::OnPromiseReject(Handle<JSObject> promise, Handle<Object> value) { 2519 void Debug::OnPromiseReject(Handle<JSObject> promise, Handle<Object> value) {
2575 if (in_debug_scope() || ignore_events()) return; 2520 if (in_debug_scope() || ignore_events()) return;
2576 HandleScope scope(isolate_); 2521 HandleScope scope(isolate_);
2577 OnException(value, false, promise); 2522 OnException(value, false, promise);
2578 } 2523 }
2579 2524
2580 2525
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after
3416 logger_->DebugEvent("Put", message.text()); 3361 logger_->DebugEvent("Put", message.text());
3417 } 3362 }
3418 3363
3419 3364
3420 void LockingCommandMessageQueue::Clear() { 3365 void LockingCommandMessageQueue::Clear() {
3421 base::LockGuard<base::Mutex> lock_guard(&mutex_); 3366 base::LockGuard<base::Mutex> lock_guard(&mutex_);
3422 queue_.Clear(); 3367 queue_.Clear();
3423 } 3368 }
3424 3369
3425 } } // namespace v8::internal 3370 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/debug.h ('k') | src/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698