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

Side by Side Diff: src/debug/debug.cc

Issue 2465553003: [inspector] added Debugger.getPossibleBreakpoints method (Closed)
Patch Set: addressed comments Created 4 years, 1 month 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 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/debug/debug.h" 5 #include "src/debug/debug.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 1334 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 } 1345 }
1346 1346
1347 // Update PCs on the stack to point to recompiled code. 1347 // Update PCs on the stack to point to recompiled code.
1348 RedirectActiveFunctions redirect_visitor(*shared); 1348 RedirectActiveFunctions redirect_visitor(*shared);
1349 redirect_visitor.VisitThread(isolate_, isolate_->thread_local_top()); 1349 redirect_visitor.VisitThread(isolate_, isolate_->thread_local_top());
1350 isolate_->thread_manager()->IterateArchivedThreads(&redirect_visitor); 1350 isolate_->thread_manager()->IterateArchivedThreads(&redirect_visitor);
1351 1351
1352 return true; 1352 return true;
1353 } 1353 }
1354 1354
1355 namespace {
1356 template <typename Iterator>
1357 void GetBreakablePositions(Iterator& it, int start_position, int end_position,
1358 BreakPositionAlignment alignment,
1359 std::vector<int>& positions) {
1360 it.SkipToPosition(start_position, alignment);
1361 while (!it.Done() && it.position() < end_position &&
1362 it.position() >= start_position) {
1363 positions.push_back(alignment == STATEMENT_ALIGNED ? it.statement_position()
1364 : it.position());
1365 it.Next();
1366 }
1367 }
1368 } // namespace
1369
1370 void Debug::FindBreakablePositions(Handle<DebugInfo> debug_info,
1371 int start_position, int end_position,
1372 BreakPositionAlignment alignment,
1373 std::vector<int>& positions) {
Yang 2016/11/03 08:03:26 I've seen you do this elsewhere, but maybe we shou
kozy 2016/11/03 17:26:45 Changed to pointer.
1374 if (debug_info->HasDebugCode()) {
1375 CodeBreakIterator it(debug_info, ALL_BREAK_LOCATIONS);
1376 GetBreakablePositions(it, start_position, end_position, alignment,
1377 positions);
1378 } else {
1379 DCHECK(debug_info->HasDebugBytecodeArray());
1380 BytecodeArrayBreakIterator it(debug_info, ALL_BREAK_LOCATIONS);
1381 GetBreakablePositions(it, start_position, end_position, alignment,
1382 positions);
1383 }
1384 }
1385
1386 bool Debug::GetPossibleBreakpoints(Handle<Script> script, int start_position,
1387 int end_position,
1388 std::vector<int>& positions) {
1389 while (true) {
1390 if (!script->shared_function_infos()->IsWeakFixedArray()) return false;
1391
1392 WeakFixedArray* infos =
1393 WeakFixedArray::cast(script->shared_function_infos());
1394 HandleScope scope(isolate_);
1395 Handle<FixedArray> candidates =
Yang 2016/11/03 08:03:26 Can we simply use a List<Handle<>> here?
kozy 2016/11/03 17:26:45 Done.
1396 isolate_->factory()->NewFixedArray(infos->Length());
1397 int length = 0;
1398 {
1399 WeakFixedArray::Iterator iterator(infos);
1400 SharedFunctionInfo* info;
1401 while ((info = iterator.Next<SharedFunctionInfo>())) {
1402 if (info->end_position() < start_position ||
1403 info->start_position() >= end_position) {
1404 continue;
1405 }
1406 if (!info->IsSubjectToDebugging()) continue;
1407 if (!info->HasDebugCode() && !info->allows_lazy_compilation()) continue;
1408 candidates->set(length++, info);
1409 }
1410 }
1411 candidates->Shrink(length);
1412
1413 bool was_compiled = false;
1414 for (int i = 0; i < length; ++i) {
1415 SharedFunctionInfo* info = SharedFunctionInfo::cast(candidates->get(i));
1416 Handle<SharedFunctionInfo> info_handle(info);
1417 if (!info_handle->HasDebugCode()) {
1418 if (!Compiler::CompileDebugCode(info_handle)) {
1419 return false;
1420 } else {
1421 was_compiled = true;
1422 }
1423 }
1424 if (!info_handle->HasDebugInfo()) CreateDebugInfo(info_handle);
1425 }
1426 if (was_compiled) continue;
1427
1428 for (int i = 0; i < length; ++i) {
1429 SharedFunctionInfo* info = SharedFunctionInfo::cast(candidates->get(i));
1430 HandleScope scope(isolate_);
1431 Handle<SharedFunctionInfo> info_handle(info);
1432 CHECK(info->HasDebugInfo());
1433 Handle<DebugInfo> debug_info(info_handle->GetDebugInfo());
1434 FindBreakablePositions(debug_info, start_position, end_position,
1435 STATEMENT_ALIGNED, positions);
1436 }
1437 return true;
1438 }
1439 UNREACHABLE();
1440 return false;
1441 }
1442
1355 void Debug::RecordAsyncFunction(Handle<JSGeneratorObject> generator_object) { 1443 void Debug::RecordAsyncFunction(Handle<JSGeneratorObject> generator_object) {
1356 if (last_step_action() <= StepOut) return; 1444 if (last_step_action() <= StepOut) return;
1357 if (!IsAsyncFunction(generator_object->function()->shared()->kind())) return; 1445 if (!IsAsyncFunction(generator_object->function()->shared()->kind())) return;
1358 DCHECK(!has_suspended_generator()); 1446 DCHECK(!has_suspended_generator());
1359 thread_local_.suspended_generator_ = *generator_object; 1447 thread_local_.suspended_generator_ = *generator_object;
1360 ClearStepping(); 1448 ClearStepping();
1361 } 1449 }
1362 1450
1363 class SharedFunctionInfoFinder { 1451 class SharedFunctionInfoFinder {
1364 public: 1452 public:
(...skipping 1198 matching lines...) Expand 10 before | Expand all | Expand 10 after
2563 } 2651 }
2564 2652
2565 2653
2566 void LockingCommandMessageQueue::Clear() { 2654 void LockingCommandMessageQueue::Clear() {
2567 base::LockGuard<base::Mutex> lock_guard(&mutex_); 2655 base::LockGuard<base::Mutex> lock_guard(&mutex_);
2568 queue_.Clear(); 2656 queue_.Clear();
2569 } 2657 }
2570 2658
2571 } // namespace internal 2659 } // namespace internal
2572 } // namespace v8 2660 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698