| OLD | NEW |
| 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 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1237 if (isolate_->concurrent_recompilation_enabled()) { | 1237 if (isolate_->concurrent_recompilation_enabled()) { |
| 1238 isolate_->optimizing_compile_dispatcher()->Flush(); | 1238 isolate_->optimizing_compile_dispatcher()->Flush(); |
| 1239 } | 1239 } |
| 1240 | 1240 |
| 1241 List<Handle<JSFunction> > functions; | 1241 List<Handle<JSFunction> > functions; |
| 1242 | 1242 |
| 1243 // Flush all optimized code maps. Note that the below heap iteration does not | 1243 // Flush all optimized code maps. Note that the below heap iteration does not |
| 1244 // cover this, because the given function might have been inlined into code | 1244 // cover this, because the given function might have been inlined into code |
| 1245 // for which no JSFunction exists. | 1245 // for which no JSFunction exists. |
| 1246 { | 1246 { |
| 1247 SharedFunctionInfo::Iterator iterator(isolate_); | 1247 SharedFunctionInfo::GlobalIterator iterator(isolate_); |
| 1248 while (SharedFunctionInfo* shared = iterator.Next()) { | 1248 while (SharedFunctionInfo* shared = iterator.Next()) { |
| 1249 shared->ClearCodeFromOptimizedCodeMap(); | 1249 shared->ClearCodeFromOptimizedCodeMap(); |
| 1250 } | 1250 } |
| 1251 } | 1251 } |
| 1252 | 1252 |
| 1253 // The native context also has a list of OSR'd optimized code. Clear it. | 1253 // The native context also has a list of OSR'd optimized code. Clear it. |
| 1254 isolate_->ClearOSROptimizedCode(); | 1254 isolate_->ClearOSROptimizedCode(); |
| 1255 | 1255 |
| 1256 // Make sure we abort incremental marking. | 1256 // Make sure we abort incremental marking. |
| 1257 isolate_->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, | 1257 isolate_->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1328 BytecodeArrayBreakIterator it(debug_info, ALL_BREAK_LOCATIONS); | 1328 BytecodeArrayBreakIterator it(debug_info, ALL_BREAK_LOCATIONS); |
| 1329 GetBreakablePositions(&it, start_position, end_position, alignment, | 1329 GetBreakablePositions(&it, start_position, end_position, alignment, |
| 1330 positions); | 1330 positions); |
| 1331 } | 1331 } |
| 1332 } | 1332 } |
| 1333 } // namespace | 1333 } // namespace |
| 1334 | 1334 |
| 1335 bool Debug::GetPossibleBreakpoints(Handle<Script> script, int start_position, | 1335 bool Debug::GetPossibleBreakpoints(Handle<Script> script, int start_position, |
| 1336 int end_position, std::set<int>* positions) { | 1336 int end_position, std::set<int>* positions) { |
| 1337 while (true) { | 1337 while (true) { |
| 1338 if (!script->shared_function_infos()->IsWeakFixedArray()) return false; | |
| 1339 | |
| 1340 WeakFixedArray* infos = | |
| 1341 WeakFixedArray::cast(script->shared_function_infos()); | |
| 1342 HandleScope scope(isolate_); | 1338 HandleScope scope(isolate_); |
| 1343 List<Handle<SharedFunctionInfo>> candidates; | 1339 List<Handle<SharedFunctionInfo>> candidates; |
| 1344 { | 1340 SharedFunctionInfo::ScriptIterator iterator(script); |
| 1345 WeakFixedArray::Iterator iterator(infos); | 1341 for (SharedFunctionInfo* info = iterator.Next(); info != nullptr; |
| 1346 SharedFunctionInfo* info; | 1342 info = iterator.Next()) { |
| 1347 while ((info = iterator.Next<SharedFunctionInfo>())) { | 1343 if (info->end_position() < start_position || |
| 1348 if (info->end_position() < start_position || | 1344 info->start_position() >= end_position) { |
| 1349 info->start_position() >= end_position) { | 1345 continue; |
| 1350 continue; | |
| 1351 } | |
| 1352 if (!info->IsSubjectToDebugging()) continue; | |
| 1353 if (!info->HasDebugCode() && !info->allows_lazy_compilation()) continue; | |
| 1354 candidates.Add(i::handle(info)); | |
| 1355 } | 1346 } |
| 1347 if (!info->IsSubjectToDebugging()) continue; |
| 1348 if (!info->HasDebugCode() && !info->allows_lazy_compilation()) continue; |
| 1349 candidates.Add(i::handle(info)); |
| 1356 } | 1350 } |
| 1357 | 1351 |
| 1358 bool was_compiled = false; | 1352 bool was_compiled = false; |
| 1359 for (int i = 0; i < candidates.length(); ++i) { | 1353 for (int i = 0; i < candidates.length(); ++i) { |
| 1360 // Code that cannot be compiled lazily are internal and not debuggable. | 1354 // Code that cannot be compiled lazily are internal and not debuggable. |
| 1361 DCHECK(candidates[i]->allows_lazy_compilation()); | 1355 DCHECK(candidates[i]->allows_lazy_compilation()); |
| 1362 if (!candidates[i]->HasDebugCode()) { | 1356 if (!candidates[i]->HasDebugCode()) { |
| 1363 if (!Compiler::CompileDebugCode(candidates[i])) { | 1357 if (!Compiler::CompileDebugCode(candidates[i])) { |
| 1364 return false; | 1358 return false; |
| 1365 } else { | 1359 } else { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1455 // While we are at this, also ensure code with debug break slots so that we do | 1449 // While we are at this, also ensure code with debug break slots so that we do |
| 1456 // not have to compile a SFI without JSFunction, which is paifu for those that | 1450 // not have to compile a SFI without JSFunction, which is paifu for those that |
| 1457 // cannot be compiled without context (need to find outer compilable SFI etc.) | 1451 // cannot be compiled without context (need to find outer compilable SFI etc.) |
| 1458 Handle<Object> Debug::FindSharedFunctionInfoInScript(Handle<Script> script, | 1452 Handle<Object> Debug::FindSharedFunctionInfoInScript(Handle<Script> script, |
| 1459 int position) { | 1453 int position) { |
| 1460 for (int iteration = 0;; iteration++) { | 1454 for (int iteration = 0;; iteration++) { |
| 1461 // Go through all shared function infos associated with this script to | 1455 // Go through all shared function infos associated with this script to |
| 1462 // find the inner most function containing this position. | 1456 // find the inner most function containing this position. |
| 1463 // If there is no shared function info for this script at all, there is | 1457 // If there is no shared function info for this script at all, there is |
| 1464 // no point in looking for it by walking the heap. | 1458 // no point in looking for it by walking the heap. |
| 1465 if (!script->shared_function_infos()->IsWeakFixedArray()) break; | |
| 1466 | 1459 |
| 1467 SharedFunctionInfo* shared; | 1460 SharedFunctionInfo* shared; |
| 1468 { | 1461 { |
| 1469 SharedFunctionInfoFinder finder(position); | 1462 SharedFunctionInfoFinder finder(position); |
| 1470 WeakFixedArray::Iterator iterator(script->shared_function_infos()); | 1463 SharedFunctionInfo::ScriptIterator iterator(script); |
| 1471 SharedFunctionInfo* candidate; | 1464 for (SharedFunctionInfo* info = iterator.Next(); info != nullptr; |
| 1472 while ((candidate = iterator.Next<SharedFunctionInfo>())) { | 1465 info = iterator.Next()) { |
| 1473 finder.NewCandidate(candidate); | 1466 finder.NewCandidate(info); |
| 1474 } | 1467 } |
| 1475 shared = finder.Result(); | 1468 shared = finder.Result(); |
| 1476 if (shared == NULL) break; | 1469 if (shared == NULL) break; |
| 1477 // We found it if it's already compiled and has debug code. | 1470 // We found it if it's already compiled and has debug code. |
| 1478 if (shared->HasDebugCode()) { | 1471 if (shared->HasDebugCode()) { |
| 1479 Handle<SharedFunctionInfo> shared_handle(shared); | 1472 Handle<SharedFunctionInfo> shared_handle(shared); |
| 1480 // If the iteration count is larger than 1, we had to compile the outer | 1473 // If the iteration count is larger than 1, we had to compile the outer |
| 1481 // function in order to create this shared function info. So there can | 1474 // function in order to create this shared function info. So there can |
| 1482 // be no JSFunction referencing it. We can anticipate creating a debug | 1475 // be no JSFunction referencing it. We can anticipate creating a debug |
| 1483 // info while bypassing PrepareFunctionForBreakpoints. | 1476 // info while bypassing PrepareFunctionForBreakpoints. |
| (...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2501 logger_->DebugEvent("Put", message.text()); | 2494 logger_->DebugEvent("Put", message.text()); |
| 2502 } | 2495 } |
| 2503 | 2496 |
| 2504 void LockingCommandMessageQueue::Clear() { | 2497 void LockingCommandMessageQueue::Clear() { |
| 2505 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 2498 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| 2506 queue_.Clear(); | 2499 queue_.Clear(); |
| 2507 } | 2500 } |
| 2508 | 2501 |
| 2509 } // namespace internal | 2502 } // namespace internal |
| 2510 } // namespace v8 | 2503 } // namespace v8 |
| OLD | NEW |