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/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 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 global_handles->Create(Object::cast(*new_table))); | 407 global_handles->Create(Object::cast(*new_table))); |
408 } | 408 } |
409 | 409 |
410 | 410 |
411 ScriptCache::~ScriptCache() { | 411 ScriptCache::~ScriptCache() { |
412 isolate_->global_handles()->Destroy(Handle<Object>::cast(table_).location()); | 412 isolate_->global_handles()->Destroy(Handle<Object>::cast(table_).location()); |
413 table_ = Handle<WeakValueHashTable>(); | 413 table_ = Handle<WeakValueHashTable>(); |
414 } | 414 } |
415 | 415 |
416 | 416 |
417 void Debug::HandlePhantomDebugInfo( | |
418 const v8::WeakCallbackInfo<DebugInfoListNode>& data) { | |
419 DebugInfoListNode* node = data.GetParameter(); | |
420 node->ClearInfo(); | |
421 Debug* debug = reinterpret_cast<Isolate*>(data.GetIsolate())->debug(); | |
422 debug->RemoveDebugInfo(node); | |
423 #ifdef DEBUG | |
424 for (DebugInfoListNode* n = debug->debug_info_list_; | |
425 n != NULL; | |
426 n = n->next()) { | |
427 DCHECK(n != node); | |
428 } | |
429 #endif | |
430 } | |
431 | |
432 | |
433 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { | 417 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { |
434 // Globalize the request debug info object and make it weak. | 418 // Globalize the request debug info object and make it weak. |
435 GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles(); | 419 GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles(); |
436 debug_info_ = | 420 debug_info_ = |
437 Handle<DebugInfo>::cast(global_handles->Create(debug_info)).location(); | 421 Handle<DebugInfo>::cast(global_handles->Create(debug_info)).location(); |
438 typedef WeakCallbackInfo<void>::Callback Callback; | |
439 GlobalHandles::MakeWeak( | |
440 reinterpret_cast<Object**>(debug_info_), this, | |
441 reinterpret_cast<Callback>(Debug::HandlePhantomDebugInfo), | |
442 v8::WeakCallbackType::kParameter); | |
443 } | 422 } |
444 | 423 |
445 | 424 |
446 void DebugInfoListNode::ClearInfo() { | 425 DebugInfoListNode::~DebugInfoListNode() { |
447 if (debug_info_ == nullptr) return; | 426 if (debug_info_ == nullptr) return; |
448 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_)); | 427 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_)); |
449 debug_info_ = nullptr; | 428 debug_info_ = nullptr; |
450 } | 429 } |
451 | 430 |
452 | 431 |
453 bool Debug::CompileDebuggerScript(Isolate* isolate, int index) { | 432 bool Debug::CompileDebuggerScript(Isolate* isolate, int index) { |
454 Factory* factory = isolate->factory(); | 433 Factory* factory = isolate->factory(); |
455 HandleScope scope(isolate); | 434 HandleScope scope(isolate); |
456 | 435 |
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1647 | 1626 |
1648 // Add debug info to the list. | 1627 // Add debug info to the list. |
1649 DebugInfoListNode* node = new DebugInfoListNode(*debug_info); | 1628 DebugInfoListNode* node = new DebugInfoListNode(*debug_info); |
1650 node->set_next(debug_info_list_); | 1629 node->set_next(debug_info_list_); |
1651 debug_info_list_ = node; | 1630 debug_info_list_ = node; |
1652 | 1631 |
1653 return true; | 1632 return true; |
1654 } | 1633 } |
1655 | 1634 |
1656 | 1635 |
1657 void Debug::RemoveDebugInfo(DebugInfoListNode* prev, DebugInfoListNode* node) { | |
1658 // Unlink from list. If prev is NULL we are looking at the first element. | |
1659 if (prev == NULL) { | |
1660 debug_info_list_ = node->next(); | |
1661 } else { | |
1662 prev->set_next(node->next()); | |
1663 } | |
1664 delete node; | |
1665 } | |
1666 | |
1667 | |
1668 void Debug::RemoveDebugInfo(DebugInfo** debug_info) { | |
1669 DCHECK(debug_info_list_ != NULL); | |
1670 // Run through the debug info objects to find this one and remove it. | |
1671 DebugInfoListNode* prev = NULL; | |
1672 DebugInfoListNode* current = debug_info_list_; | |
1673 while (current != NULL) { | |
1674 if (current->debug_info().location() == debug_info) { | |
1675 RemoveDebugInfo(prev, current); | |
1676 return; | |
1677 } | |
1678 // Move to next in list. | |
1679 prev = current; | |
1680 current = current->next(); | |
1681 } | |
1682 UNREACHABLE(); | |
1683 } | |
1684 | |
1685 | |
1686 void Debug::RemoveDebugInfo(DebugInfoListNode* node) { | |
1687 DCHECK(debug_info_list_ != NULL); | |
1688 // Run through the debug info objects to find this one and remove it. | |
1689 DebugInfoListNode* prev = NULL; | |
1690 DebugInfoListNode* current = debug_info_list_; | |
1691 while (current != NULL) { | |
1692 if (current == node) { | |
1693 RemoveDebugInfo(prev, node); | |
1694 return; | |
1695 } | |
1696 // Move to next in list. | |
1697 prev = current; | |
1698 current = current->next(); | |
1699 } | |
1700 UNREACHABLE(); | |
1701 } | |
1702 | |
1703 | |
1704 void Debug::RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info) { | 1636 void Debug::RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info) { |
1705 HandleScope scope(isolate_); | 1637 HandleScope scope(isolate_); |
1706 Handle<SharedFunctionInfo> shared(debug_info->shared()); | 1638 Handle<SharedFunctionInfo> shared(debug_info->shared()); |
1707 | 1639 |
1708 RemoveDebugInfo(debug_info.location()); | 1640 DCHECK_NOT_NULL(debug_info_list_); |
| 1641 // Run through the debug info objects to find this one and remove it. |
| 1642 DebugInfoListNode* prev = NULL; |
| 1643 DebugInfoListNode* current = debug_info_list_; |
| 1644 while (current != NULL) { |
| 1645 if (current->debug_info().is_identical_to(debug_info)) { |
| 1646 // Unlink from list. If prev is NULL we are looking at the first element. |
| 1647 if (prev == NULL) { |
| 1648 debug_info_list_ = current->next(); |
| 1649 } else { |
| 1650 prev->set_next(current->next()); |
| 1651 } |
| 1652 delete current; |
| 1653 shared->set_debug_info(isolate_->heap()->undefined_value()); |
| 1654 return; |
| 1655 } |
| 1656 // Move to next in list. |
| 1657 prev = current; |
| 1658 current = current->next(); |
| 1659 } |
1709 | 1660 |
1710 shared->set_debug_info(isolate_->heap()->undefined_value()); | 1661 UNREACHABLE(); |
1711 } | 1662 } |
1712 | 1663 |
1713 | 1664 |
1714 void Debug::SetAfterBreakTarget(JavaScriptFrame* frame) { | 1665 void Debug::SetAfterBreakTarget(JavaScriptFrame* frame) { |
1715 after_break_target_ = NULL; | 1666 after_break_target_ = NULL; |
1716 | 1667 |
1717 if (LiveEdit::SetAfterBreakTarget(this)) return; // LiveEdit did the job. | 1668 if (LiveEdit::SetAfterBreakTarget(this)) return; // LiveEdit did the job. |
1718 | 1669 |
1719 // Continue just after the slot. | 1670 // Continue just after the slot. |
1720 after_break_target_ = frame->pc(); | 1671 after_break_target_ = frame->pc(); |
(...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2825 } | 2776 } |
2826 | 2777 |
2827 | 2778 |
2828 void LockingCommandMessageQueue::Clear() { | 2779 void LockingCommandMessageQueue::Clear() { |
2829 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 2780 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
2830 queue_.Clear(); | 2781 queue_.Clear(); |
2831 } | 2782 } |
2832 | 2783 |
2833 } // namespace internal | 2784 } // namespace internal |
2834 } // namespace v8 | 2785 } // namespace v8 |
OLD | NEW |