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

Side by Side Diff: Source/bindings/dart/DartScriptDebugServer.cpp

Issue 466243002: Support merged Dart-JS callstacks (Closed) Base URL: svn://svn.chromium.org/blink/branches/dart/dartium
Patch Set: Created 6 years, 3 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 | « Source/bindings/dart/DartScriptDebugServer.h ('k') | Source/bindings/v8/DebuggerScript.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2014 Google Inc. All rights reserved. 2 * Copyright (C) 2014 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 return it->value; 454 return it->value;
455 } 455 }
456 return ""; 456 return "";
457 } 457 }
458 458
459 DartScriptDebugServer::DartScriptDebugServer() 459 DartScriptDebugServer::DartScriptDebugServer()
460 : m_pauseOnExceptionState(DontPauseOnExceptions) 460 : m_pauseOnExceptionState(DontPauseOnExceptions)
461 , m_breakpointsActivated(true) 461 , m_breakpointsActivated(true)
462 , m_runningNestedMessageLoop(false) 462 , m_runningNestedMessageLoop(false)
463 , m_executionState(0) 463 , m_executionState(0)
464 , m_isPaused(false)
464 , m_pausedIsolate(0) 465 , m_pausedIsolate(0)
465 , m_pausedPage(0) 466 , m_pausedPage(0)
466 , m_clientMessageLoop(0) 467 , m_clientMessageLoop(0)
467 , m_nextPageId(1) 468 , m_nextPageId(1)
468 { 469 {
469 } 470 }
470 471
471 DartScriptDebugServer::~DartScriptDebugServer() 472 DartScriptDebugServer::~DartScriptDebugServer()
472 { 473 {
473 for (DebugDataMap::iterator it = m_pageIdToDebugDataMap.begin(); it != m_pag eIdToDebugDataMap.end(); ++it) 474 for (DebugDataMap::iterator it = m_pageIdToDebugDataMap.begin(); it != m_pag eIdToDebugDataMap.end(); ++it)
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 return; 627 return;
627 628
628 // FIXME: determine if this method needs to be implemented for Dart. 629 // FIXME: determine if this method needs to be implemented for Dart.
629 } 630 }
630 631
631 void DartScriptDebugServer::continueProgram() 632 void DartScriptDebugServer::continueProgram()
632 { 633 {
633 if (isPaused()) 634 if (isPaused())
634 quitMessageLoopOnPause(); 635 quitMessageLoopOnPause();
635 m_executionState = 0; 636 m_executionState = 0;
637 m_isPaused = false;
636 m_pausedIsolate = 0; 638 m_pausedIsolate = 0;
637 } 639 }
638 640
639 void DartScriptDebugServer::stepIntoStatement() 641 void DartScriptDebugServer::stepIntoStatement()
640 { 642 {
641 ASSERT(isPaused()); 643 ASSERT(isPaused());
642 Dart_SetStepInto(); 644 Dart_SetStepInto();
643 continueProgram(); 645 continueProgram();
644 } 646 }
645 647
646 void DartScriptDebugServer::stepOverStatement() 648 void DartScriptDebugServer::stepOverStatement()
647 { 649 {
648 ASSERT(isPaused()); 650 ASSERT(isPaused());
649 Dart_SetStepOver(); 651 Dart_SetStepOver();
650 continueProgram(); 652 continueProgram();
651 } 653 }
652 654
653 void DartScriptDebugServer::stepOutOfFunction() 655 void DartScriptDebugServer::stepOutOfFunction()
654 { 656 {
655 ASSERT(isPaused()); 657 ASSERT(isPaused());
656 Dart_SetStepOut(); 658 Dart_SetStepOut();
657 continueProgram(); 659 continueProgram();
658 } 660 }
659 661
660 bool DartScriptDebugServer::setScriptSource(const String& sourceID, const String & newContent, bool preview, String* error, RefPtr<TypeBuilder::Debugger::SetScri ptSourceError>& errorData, StackTrace* newCallFrames, RefPtr<JSONObject>* result ) 662 bool DartScriptDebugServer::setScriptSource(const String& sourceID, const String & newContent, bool preview, String* error, RefPtr<TypeBuilder::Debugger::SetScri ptSourceError>& errorData, StackTraces* newCallFrames, RefPtr<JSONObject>* resul t)
661 { 663 {
662 *error = "Dart does not support live editing source code yet."; 664 *error = "Dart does not support live editing source code yet.";
663 return false; 665 return false;
664 } 666 }
665 667
666 bool DartScriptDebugServer::executeSkipPauseRequest(ScriptDebugListener::SkipPau seRequest request, Dart_StackTrace stackTrace) 668 bool DartScriptDebugServer::executeSkipPauseRequest(ScriptDebugListener::SkipPau seRequest request, Dart_StackTrace stackTrace)
667 { 669 {
668 switch (request) { 670 switch (request) {
669 case ScriptDebugListener::NoSkip: 671 case ScriptDebugListener::NoSkip:
670 return false; 672 return false;
671 case ScriptDebugListener::Continue: 673 case ScriptDebugListener::Continue:
672 return true; 674 return true;
673 case ScriptDebugListener::StepInto: 675 case ScriptDebugListener::StepInto:
674 case ScriptDebugListener::StepOut: 676 case ScriptDebugListener::StepOut:
675 break; 677 break;
676 } 678 }
677 ASSERT(0); 679 ASSERT(0);
678 // FIXMEDART: actually do something jacobr JACOBR 680 // FIXMEDART: actually do something jacobr JACOBR
679 return true; 681 return true;
680 } 682 }
681 683
682 int DartScriptDebugServer::frameCount() 684 int DartScriptDebugServer::frameCount()
683 { 685 {
684 ASSERT(isPaused()); 686 ASSERT(isPaused());
685 intptr_t length = 0; 687 intptr_t length = 0;
686 Dart_StackTraceLength(m_executionState, &length); 688 Dart_StackTraceLength(m_executionState, &length);
687 return length; 689 return length;
688 } 690 }
689 691
690 StackTrace DartScriptDebugServer::currentCallFrames() 692 StackTraces DartScriptDebugServer::currentCallFrames()
691 { 693 {
692 return StackTrace(m_executionState); 694 if (!m_executionState) {
695 if (!Dart_CurrentIsolate())
696 return StackTraces();
697 ASSERT(!m_isPaused);
698 // We are not paused at a Dart breakpoint but there may be Dart frames
699 // on the call stack.
700
701 Dart_Handle ALLOW_UNUSED result = Dart_GetStackTrace(&m_executionState);
702 ASSERT(!Dart_IsError(result));
703 if (!m_executionState)
704 return StackTraces();
705 intptr_t length = 0;
706 Dart_StackTraceLength(m_executionState, &length);
707 if (!length) {
708 ASSERT_NOT_REACHED();
709 m_executionState = 0;
710 return StackTraces();
711 }
712 }
713 return StackTraces(StackTrace(m_executionState), DartUtilities::currentScrip tState());
693 } 714 }
694 715
695 StackTrace DartScriptDebugServer::currentCallFramesForAsyncStack() 716 StackTraces DartScriptDebugServer::currentCallFramesForAsyncStack()
696 { 717 {
697 // FIXMEDART: implement propertly. These are the regular not Async call fram es. 718 // FIXMEDART: implement propertly. These are the regular not Async call fram es.
698 return StackTrace(m_executionState); 719 return currentCallFrames();
699 } 720 }
700 721
701 bool DartScriptDebugServer::isPaused() 722 bool DartScriptDebugServer::isPaused()
702 { 723 {
703 return !!m_executionState; 724 return m_isPaused;
704 } 725 }
705 726
706 void DartScriptDebugServer::clearCompiledScripts() 727 void DartScriptDebugServer::clearCompiledScripts()
707 { 728 {
708 // FIXMEDART: is this meaningful for Dart? 729 // FIXMEDART: is this meaningful for Dart?
709 // Currently tracking what scripts have been compiled is handled by a 730 // Currently tracking what scripts have been compiled is handled by a
710 // different class. 731 // different class.
711 } 732 }
712 733
713 void DartScriptDebugServer::setPreprocessorSource(const String& preprocessorSour ce) 734 void DartScriptDebugServer::setPreprocessorSource(const String& preprocessorSour ce)
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
954 975
955 DartPageDebug* DartScriptDebugServer::lookupPageDebugForCurrentIsolate() 976 DartPageDebug* DartScriptDebugServer::lookupPageDebugForCurrentIsolate()
956 { 977 {
957 Page* page = DartUtilities::domWindowForCurrentIsolate()->document()->page() ; 978 Page* page = DartUtilities::domWindowForCurrentIsolate()->document()->page() ;
958 return lookupPageDebug(page); 979 return lookupPageDebug(page);
959 } 980 }
960 981
961 void DartScriptDebugServer::handleProgramBreak(Dart_Isolate isolate, Dart_StackT race stackTrace, intptr_t dartBreakpointId, Dart_Handle exception, const Dart_Co deLocation& location) 982 void DartScriptDebugServer::handleProgramBreak(Dart_Isolate isolate, Dart_StackT race stackTrace, intptr_t dartBreakpointId, Dart_Handle exception, const Dart_Co deLocation& location)
962 { 983 {
963 ASSERT(isolate == Dart_CurrentIsolate()); 984 ASSERT(isolate == Dart_CurrentIsolate());
985
964 // Don't allow nested breaks. 986 // Don't allow nested breaks.
965 if (isAnyScriptPaused()) 987 if (isAnyScriptPaused())
966 return; 988 return;
967 989
968 DartPageDebug* pageDebug = lookupPageDebugForCurrentIsolate(); 990 DartPageDebug* pageDebug = lookupPageDebugForCurrentIsolate();
969 if (!pageDebug) 991 if (!pageDebug)
970 return; 992 return;
971 ScriptDebugListener* listener = pageDebug->listener(); 993 ScriptDebugListener* listener = pageDebug->listener();
972 994
973 if (!listener) 995 if (!listener)
974 return; 996 return;
975 997
976 // Required as some Dart code executes outside of a valid V8 scope when 998 // Required as some Dart code executes outside of a valid V8 scope when
977 // the program is paused due to interrupting a Dart isolate. 999 // the program is paused due to interrupting a Dart isolate.
978 V8Scope v8Scope(DartDOMData::current()); 1000 V8Scope v8Scope(DartDOMData::current());
979 1001
980 Vector<String> breakpointIds; 1002 Vector<String> breakpointIds;
981 breakpointIds.append(pageDebug->lookupBreakpointId(dartBreakpointId)); 1003 breakpointIds.append(pageDebug->lookupBreakpointId(dartBreakpointId));
982 m_executionState = stackTrace; 1004 m_executionState = stackTrace;
1005 m_isPaused = true;
983 m_pausedIsolate = isolate; 1006 m_pausedIsolate = isolate;
984 DartScriptState* scriptState = DartUtilities::currentScriptState(); 1007 DartScriptState* scriptState = DartUtilities::currentScriptState();
985 ScriptDebugListener::SkipPauseRequest result = listener->didPause(scriptStat e, currentCallFrames(), exception ? DartUtilities::dartToScriptValue(exception) : ScriptValue(), breakpointIds); 1008 ScriptDebugListener::SkipPauseRequest result = listener->didPause(scriptStat e, exception ? DartUtilities::dartToScriptValue(exception) : ScriptValue(), brea kpointIds);
986 1009
987 if (result == ScriptDebugListener::NoSkip) { 1010 if (result == ScriptDebugListener::NoSkip) {
988 m_runningNestedMessageLoop = true; 1011 m_runningNestedMessageLoop = true;
989 runMessageLoopOnPause(isolate); 1012 runMessageLoopOnPause(isolate);
990 m_runningNestedMessageLoop = false; 1013 m_runningNestedMessageLoop = false;
991 } 1014 }
992 if (result == ScriptDebugListener::StepInto) { 1015 if (result == ScriptDebugListener::StepInto) {
993 Dart_SetStepInto(); 1016 Dart_SetStepInto();
994 } else if (result == ScriptDebugListener::StepOut) { 1017 } else if (result == ScriptDebugListener::StepOut) {
995 Dart_SetStepOut(); 1018 Dart_SetStepOut();
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 } 1177 }
1155 1178
1156 void UnifiedScriptDebugServer::setPauseOnExceptionsState(ScriptDebugServer::Paus eOnExceptionsState pauseOnExceptionsState) 1179 void UnifiedScriptDebugServer::setPauseOnExceptionsState(ScriptDebugServer::Paus eOnExceptionsState pauseOnExceptionsState)
1157 { 1180 {
1158 m_dart->setPauseOnExceptionsState(pauseOnExceptionsState); 1181 m_dart->setPauseOnExceptionsState(pauseOnExceptionsState);
1159 m_v8->setPauseOnExceptionsState(pauseOnExceptionsState); 1182 m_v8->setPauseOnExceptionsState(pauseOnExceptionsState);
1160 } 1183 }
1161 1184
1162 void UnifiedScriptDebugServer::setPauseOnNextStatement(bool pause) 1185 void UnifiedScriptDebugServer::setPauseOnNextStatement(bool pause)
1163 { 1186 {
1164 if (isPaused()) { 1187 if (isPaused())
1165 return; 1188 return;
1166 }
1167 m_v8->setPauseOnNextStatement(pause); 1189 m_v8->setPauseOnNextStatement(pause);
1168 m_dart->setPauseOnNextStatement(pause); 1190 m_dart->setPauseOnNextStatement(pause);
1169 } 1191 }
1170 1192
1171 bool UnifiedScriptDebugServer::canBreakProgram() 1193 bool UnifiedScriptDebugServer::canBreakProgram()
1172 { 1194 {
1173 return m_v8->canBreakProgram() || m_dart->canBreakProgram(); 1195 return m_v8->canBreakProgram() || m_dart->canBreakProgram();
1174 } 1196 }
1175 1197
1176 void UnifiedScriptDebugServer::breakProgram() 1198 void UnifiedScriptDebugServer::breakProgram()
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 // FIXMEDART: find a cleaner solution. 1238 // FIXMEDART: find a cleaner solution.
1217 return sourceID.startsWith(String("{\"dartScript")); 1239 return sourceID.startsWith(String("{\"dartScript"));
1218 } 1240 }
1219 1241
1220 bool UnifiedScriptDebugServer::isDartBreakpointId(const String& breakpointId) 1242 bool UnifiedScriptDebugServer::isDartBreakpointId(const String& breakpointId)
1221 { 1243 {
1222 // FIXMEDART: find a cleaner solution. 1244 // FIXMEDART: find a cleaner solution.
1223 return breakpointId.startsWith(String("{\"dartBreakpoint")); 1245 return breakpointId.startsWith(String("{\"dartBreakpoint"));
1224 } 1246 }
1225 1247
1226 bool UnifiedScriptDebugServer::setScriptSource(const String& sourceID, const Str ing& newContent, bool preview, String* error, RefPtr<TypeBuilder::Debugger::SetS criptSourceError>& errorBuilder, StackTrace* newCallFrames, RefPtr<JSONObject>* result) 1248 bool UnifiedScriptDebugServer::setScriptSource(const String& sourceID, const Str ing& newContent, bool preview, String* error, RefPtr<TypeBuilder::Debugger::SetS criptSourceError>& errorBuilder, StackTraces* newCallFrames, RefPtr<JSONObject>* result)
1227 { 1249 {
1228 if (isDartSourceID(sourceID)) 1250 if (isDartSourceID(sourceID))
1229 return m_dart->setScriptSource(sourceID, newContent, preview, error, err orBuilder, newCallFrames, result); 1251 return m_dart->setScriptSource(sourceID, newContent, preview, error, err orBuilder, newCallFrames, result);
1230 return m_v8->setScriptSource(sourceID, newContent, preview, error, errorBuil der, newCallFrames, result); 1252 return m_v8->setScriptSource(sourceID, newContent, preview, error, errorBuil der, newCallFrames, result);
1231 } 1253 }
1232 1254
1233 int UnifiedScriptDebugServer::frameCount() 1255 int UnifiedScriptDebugServer::frameCount()
1234 { 1256 {
1235 // FIXMEDART: Implement cases where both JS and Dart are paused correctly. 1257 // FIXMEDART: Implement cases where both JS and Dart are paused correctly.
1236 if (m_v8->isPaused()) { 1258 if (m_v8->isPaused()) {
1237 return m_v8->frameCount(); 1259 return m_v8->frameCount();
1238 } 1260 }
1239 return m_dart->frameCount(); 1261 return m_dart->frameCount();
1240 } 1262 }
1241 1263
1242 1264 StackTraces UnifiedScriptDebugServer::currentCallFrames()
1243 StackTrace UnifiedScriptDebugServer::currentCallFrames()
1244 { 1265 {
1245 // FIXMEDART: we need to figure out how to interleave stack traces where pos sible. 1266 StackTraces traces = m_v8->currentCallFrames();
1246 StackTrace v8StackTrace = m_v8->currentCallFrames(); 1267 traces.add(m_dart->currentCallFrames());
1247 if (!v8StackTrace.isNull()) 1268 return traces;
1248 return v8StackTrace;
1249 return m_dart->currentCallFrames();
1250 } 1269 }
1251 1270
1252 StackTrace UnifiedScriptDebugServer::currentCallFramesForAsyncStack() 1271 StackTraces UnifiedScriptDebugServer::currentCallFramesForAsyncStack()
1253 { 1272 {
1254 // FIXMEDART: we need to figure out how to interleave stack traces where pos sible. 1273 StackTraces traces = m_v8->currentCallFramesForAsyncStack();
1255 StackTrace v8StackTrace = m_v8->currentCallFramesForAsyncStack(); 1274 traces.add(m_dart->currentCallFramesForAsyncStack());
1256 if (!v8StackTrace.isNull()) 1275 return traces;
1257 return v8StackTrace;
1258 return m_dart->currentCallFramesForAsyncStack();
1259 } 1276 }
1260 1277
1261
1262 bool UnifiedScriptDebugServer::isPaused() 1278 bool UnifiedScriptDebugServer::isPaused()
1263 { 1279 {
1264 return m_v8->isPaused() || m_dart->isPaused(); 1280 return m_v8->isPaused() || m_dart->isPaused();
1265 } 1281 }
1266 1282
1267 bool UnifiedScriptDebugServer::runningNestedMessageLoop() 1283 bool UnifiedScriptDebugServer::runningNestedMessageLoop()
1268 { 1284 {
1269 return m_dart->runningNestedMessageLoop() || m_v8->runningNestedMessageLoop( ); 1285 return m_dart->runningNestedMessageLoop() || m_v8->runningNestedMessageLoop( );
1270 } 1286 }
1271 1287
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 MessageQueue<ScriptDebugServer::Task>& tasks = debugTaskQueue(); 1352 MessageQueue<ScriptDebugServer::Task>& tasks = debugTaskQueue();
1337 tasks.append(task); 1353 tasks.append(task);
1338 // The first VM interrupt method triggered will drain the task queue. 1354 // The first VM interrupt method triggered will drain the task queue.
1339 // FIXMEDART: refactor the V8 code to have an interruptAndRunAllTasks 1355 // FIXMEDART: refactor the V8 code to have an interruptAndRunAllTasks
1340 // method. 1356 // method.
1341 PageScriptDebugServer::interruptAndRun(adoptPtr(new DrainQueueTask(&tasks))) ; 1357 PageScriptDebugServer::interruptAndRun(adoptPtr(new DrainQueueTask(&tasks))) ;
1342 DartScriptDebugServer::interruptAndRunAllTasks(); 1358 DartScriptDebugServer::interruptAndRunAllTasks();
1343 } 1359 }
1344 1360
1345 } 1361 }
OLDNEW
« no previous file with comments | « Source/bindings/dart/DartScriptDebugServer.h ('k') | Source/bindings/v8/DebuggerScript.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698