Chromium Code Reviews| 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 1314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1325 BytecodeArrayBreakIterator it(debug_info, ALL_BREAK_LOCATIONS); | 1325 BytecodeArrayBreakIterator it(debug_info, ALL_BREAK_LOCATIONS); |
| 1326 GetBreakablePositions(&it, start_position, end_position, alignment, | 1326 GetBreakablePositions(&it, start_position, end_position, alignment, |
| 1327 positions); | 1327 positions); |
| 1328 } | 1328 } |
| 1329 } | 1329 } |
| 1330 } // namespace | 1330 } // namespace |
| 1331 | 1331 |
| 1332 bool Debug::GetPossibleBreakpoints(Handle<Script> script, int start_position, | 1332 bool Debug::GetPossibleBreakpoints(Handle<Script> script, int start_position, |
| 1333 int end_position, std::set<int>* positions) { | 1333 int end_position, std::set<int>* positions) { |
| 1334 while (true) { | 1334 while (true) { |
| 1335 if (!script->shared_function_infos()->IsWeakFixedArray()) return false; | 1335 FixedArray* infos = script->shared_function_infos(); |
| 1336 | |
| 1337 WeakFixedArray* infos = | |
| 1338 WeakFixedArray::cast(script->shared_function_infos()); | |
| 1339 HandleScope scope(isolate_); | 1336 HandleScope scope(isolate_); |
| 1340 List<Handle<SharedFunctionInfo>> candidates; | 1337 List<Handle<SharedFunctionInfo>> candidates; |
| 1341 { | 1338 for (int index = 0; index < infos->length(); ++index) { |
| 1342 WeakFixedArray::Iterator iterator(infos); | 1339 Object* raw = infos->get(index); |
| 1343 SharedFunctionInfo* info; | 1340 if (raw->IsSmi() || WeakCell::cast(raw)->cleared()) continue; |
|
Toon Verwaest
2016/12/06 21:10:14
I guess we should just install a cleared weak-cell
jochen (gone - plz use gerrit)
2016/12/07 15:57:00
I considered that, but it would create a lot of ov
Toon Verwaest
2016/12/08 07:31:30
Why? I presume we have a single preallocated clear
jochen (gone - plz use gerrit)
2016/12/08 12:31:14
no, we don't have that. The WeakCell currently has
| |
| 1344 while ((info = iterator.Next<SharedFunctionInfo>())) { | 1341 SharedFunctionInfo* info = |
| 1345 if (info->end_position() < start_position || | 1342 SharedFunctionInfo::cast(WeakCell::cast(raw)->value()); |
|
Toon Verwaest
2016/12/06 21:10:14
This actually makes me wonder if we shouldn't just
jochen (gone - plz use gerrit)
2016/12/07 15:57:00
if we do that, I think it should be a separate cle
Toon Verwaest
2016/12/08 07:31:30
Makes sense
| |
| 1346 info->start_position() >= end_position) { | 1343 if (info->end_position() < start_position || |
| 1347 continue; | 1344 info->start_position() >= end_position) { |
| 1348 } | 1345 continue; |
| 1349 if (!info->IsSubjectToDebugging()) continue; | |
| 1350 if (!info->HasDebugCode() && !info->allows_lazy_compilation()) continue; | |
| 1351 candidates.Add(i::handle(info)); | |
| 1352 } | 1346 } |
| 1347 if (!info->IsSubjectToDebugging()) continue; | |
| 1348 if (!info->HasDebugCode() && !info->allows_lazy_compilation()) continue; | |
| 1349 candidates.Add(i::handle(info)); | |
| 1353 } | 1350 } |
| 1354 | 1351 |
| 1355 bool was_compiled = false; | 1352 bool was_compiled = false; |
| 1356 for (int i = 0; i < candidates.length(); ++i) { | 1353 for (int i = 0; i < candidates.length(); ++i) { |
| 1357 // Code that cannot be compiled lazily are internal and not debuggable. | 1354 // Code that cannot be compiled lazily are internal and not debuggable. |
| 1358 DCHECK(candidates[i]->allows_lazy_compilation()); | 1355 DCHECK(candidates[i]->allows_lazy_compilation()); |
| 1359 if (!candidates[i]->HasDebugCode()) { | 1356 if (!candidates[i]->HasDebugCode()) { |
| 1360 if (!Compiler::CompileDebugCode(candidates[i])) { | 1357 if (!Compiler::CompileDebugCode(candidates[i])) { |
| 1361 return false; | 1358 return false; |
| 1362 } else { | 1359 } else { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1452 // 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 |
| 1453 // 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 |
| 1454 // 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.) |
| 1455 Handle<Object> Debug::FindSharedFunctionInfoInScript(Handle<Script> script, | 1452 Handle<Object> Debug::FindSharedFunctionInfoInScript(Handle<Script> script, |
| 1456 int position) { | 1453 int position) { |
| 1457 for (int iteration = 0;; iteration++) { | 1454 for (int iteration = 0;; iteration++) { |
| 1458 // Go through all shared function infos associated with this script to | 1455 // Go through all shared function infos associated with this script to |
| 1459 // find the inner most function containing this position. | 1456 // find the inner most function containing this position. |
| 1460 // 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 |
| 1461 // no point in looking for it by walking the heap. | 1458 // no point in looking for it by walking the heap. |
| 1462 if (!script->shared_function_infos()->IsWeakFixedArray()) break; | |
| 1463 | 1459 |
| 1464 SharedFunctionInfo* shared; | 1460 SharedFunctionInfo* shared; |
| 1465 { | 1461 { |
| 1466 SharedFunctionInfoFinder finder(position); | 1462 SharedFunctionInfoFinder finder(position); |
| 1467 WeakFixedArray::Iterator iterator(script->shared_function_infos()); | 1463 FixedArray* infos = script->shared_function_infos(); |
| 1468 SharedFunctionInfo* candidate; | 1464 for (int index = 0; index < infos->length(); ++index) { |
|
Toon Verwaest
2016/12/06 21:10:14
Given that we iterate at least 3 times, does it ma
jochen (gone - plz use gerrit)
2016/12/07 15:57:00
done.
| |
| 1469 while ((candidate = iterator.Next<SharedFunctionInfo>())) { | 1465 Object* raw = infos->get(index); |
| 1470 finder.NewCandidate(candidate); | 1466 if (raw->IsSmi() || WeakCell::cast(raw)->cleared()) continue; |
| 1467 finder.NewCandidate( | |
| 1468 SharedFunctionInfo::cast(WeakCell::cast(raw)->value())); | |
| 1471 } | 1469 } |
| 1472 shared = finder.Result(); | 1470 shared = finder.Result(); |
| 1473 if (shared == NULL) break; | 1471 if (shared == NULL) break; |
| 1474 // We found it if it's already compiled and has debug code. | 1472 // We found it if it's already compiled and has debug code. |
| 1475 if (shared->HasDebugCode()) { | 1473 if (shared->HasDebugCode()) { |
| 1476 Handle<SharedFunctionInfo> shared_handle(shared); | 1474 Handle<SharedFunctionInfo> shared_handle(shared); |
| 1477 // If the iteration count is larger than 1, we had to compile the outer | 1475 // If the iteration count is larger than 1, we had to compile the outer |
| 1478 // function in order to create this shared function info. So there can | 1476 // function in order to create this shared function info. So there can |
| 1479 // be no JSFunction referencing it. We can anticipate creating a debug | 1477 // be no JSFunction referencing it. We can anticipate creating a debug |
| 1480 // info while bypassing PrepareFunctionForBreakpoints. | 1478 // info while bypassing PrepareFunctionForBreakpoints. |
| (...skipping 1028 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2509 logger_->DebugEvent("Put", message.text()); | 2507 logger_->DebugEvent("Put", message.text()); |
| 2510 } | 2508 } |
| 2511 | 2509 |
| 2512 void LockingCommandMessageQueue::Clear() { | 2510 void LockingCommandMessageQueue::Clear() { |
| 2513 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 2511 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| 2514 queue_.Clear(); | 2512 queue_.Clear(); |
| 2515 } | 2513 } |
| 2516 | 2514 |
| 2517 } // namespace internal | 2515 } // namespace internal |
| 2518 } // namespace v8 | 2516 } // namespace v8 |
| OLD | NEW |