| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 if (entry->value != NULL) { | 610 if (entry->value != NULL) { |
| 611 ASSERT(*script == *reinterpret_cast<Script**>(entry->value)); | 611 ASSERT(*script == *reinterpret_cast<Script**>(entry->value)); |
| 612 return; | 612 return; |
| 613 } | 613 } |
| 614 | 614 |
| 615 // Globalize the script object, make it weak and use the location of the | 615 // Globalize the script object, make it weak and use the location of the |
| 616 // global handle as the value in the hash map. | 616 // global handle as the value in the hash map. |
| 617 Handle<Script> script_ = | 617 Handle<Script> script_ = |
| 618 Handle<Script>::cast( | 618 Handle<Script>::cast( |
| 619 (global_handles->Create(*script))); | 619 (global_handles->Create(*script))); |
| 620 global_handles->MakeWeak( | 620 global_handles->MakeWeak(reinterpret_cast<Object**>(script_.location()), |
| 621 reinterpret_cast<Object**>(script_.location()), | 621 this, |
| 622 this, | 622 NULL, |
| 623 ScriptCache::HandleWeakScript); | 623 ScriptCache::HandleWeakScript); |
| 624 entry->value = script_.location(); | 624 entry->value = script_.location(); |
| 625 } | 625 } |
| 626 | 626 |
| 627 | 627 |
| 628 Handle<FixedArray> ScriptCache::GetScripts() { | 628 Handle<FixedArray> ScriptCache::GetScripts() { |
| 629 Handle<FixedArray> instances = FACTORY->NewFixedArray(occupancy()); | 629 Handle<FixedArray> instances = FACTORY->NewFixedArray(occupancy()); |
| 630 int count = 0; | 630 int count = 0; |
| 631 for (HashMap::Entry* entry = Start(); entry != NULL; entry = Next(entry)) { | 631 for (HashMap::Entry* entry = Start(); entry != NULL; entry = Next(entry)) { |
| 632 ASSERT(entry->value != NULL); | 632 ASSERT(entry->value != NULL); |
| 633 if (entry->value != NULL) { | 633 if (entry->value != NULL) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 656 Object** location = reinterpret_cast<Object**>(entry->value); | 656 Object** location = reinterpret_cast<Object**>(entry->value); |
| 657 ASSERT((*location)->IsScript()); | 657 ASSERT((*location)->IsScript()); |
| 658 global_handles->ClearWeakness(location); | 658 global_handles->ClearWeakness(location); |
| 659 global_handles->Destroy(location); | 659 global_handles->Destroy(location); |
| 660 } | 660 } |
| 661 // Clear the content of the hash map. | 661 // Clear the content of the hash map. |
| 662 HashMap::Clear(); | 662 HashMap::Clear(); |
| 663 } | 663 } |
| 664 | 664 |
| 665 | 665 |
| 666 void ScriptCache::HandleWeakScript(v8::Persistent<v8::Value> obj, void* data) { | 666 void ScriptCache::HandleWeakScript(v8::Isolate* isolate, |
| 667 v8::Persistent<v8::Value> obj, |
| 668 void* data) { |
| 667 ScriptCache* script_cache = reinterpret_cast<ScriptCache*>(data); | 669 ScriptCache* script_cache = reinterpret_cast<ScriptCache*>(data); |
| 668 // Find the location of the global handle. | 670 // Find the location of the global handle. |
| 669 Script** location = | 671 Script** location = |
| 670 reinterpret_cast<Script**>(Utils::OpenHandle(*obj).location()); | 672 reinterpret_cast<Script**>(Utils::OpenHandle(*obj).location()); |
| 671 ASSERT((*location)->IsScript()); | 673 ASSERT((*location)->IsScript()); |
| 672 | 674 |
| 673 // Remove the entry from the cache. | 675 // Remove the entry from the cache. |
| 674 int id = Smi::cast((*location)->id())->value(); | 676 int id = Smi::cast((*location)->id())->value(); |
| 675 script_cache->Remove(reinterpret_cast<void*>(id), Hash(id)); | 677 script_cache->Remove(reinterpret_cast<void*>(id), Hash(id)); |
| 676 script_cache->collected_scripts_.Add(id); | 678 script_cache->collected_scripts_.Add(id); |
| 677 | 679 |
| 678 // Clear the weak handle. | 680 // Clear the weak handle. |
| 679 obj.Dispose(); | 681 obj.Dispose(isolate); |
| 680 obj.Clear(); | 682 obj.Clear(); |
| 681 } | 683 } |
| 682 | 684 |
| 683 | 685 |
| 684 void Debug::SetUp(bool create_heap_objects) { | 686 void Debug::SetUp(bool create_heap_objects) { |
| 685 ThreadInit(); | 687 ThreadInit(); |
| 686 if (create_heap_objects) { | 688 if (create_heap_objects) { |
| 687 // Get code to handle debug break on return. | 689 // Get code to handle debug break on return. |
| 688 debug_break_return_ = | 690 debug_break_return_ = |
| 689 isolate_->builtins()->builtin(Builtins::kReturn_DebugBreak); | 691 isolate_->builtins()->builtin(Builtins::kReturn_DebugBreak); |
| 690 ASSERT(debug_break_return_->IsCode()); | 692 ASSERT(debug_break_return_->IsCode()); |
| 691 // Get code to handle debug break in debug break slots. | 693 // Get code to handle debug break in debug break slots. |
| 692 debug_break_slot_ = | 694 debug_break_slot_ = |
| 693 isolate_->builtins()->builtin(Builtins::kSlot_DebugBreak); | 695 isolate_->builtins()->builtin(Builtins::kSlot_DebugBreak); |
| 694 ASSERT(debug_break_slot_->IsCode()); | 696 ASSERT(debug_break_slot_->IsCode()); |
| 695 } | 697 } |
| 696 } | 698 } |
| 697 | 699 |
| 698 | 700 |
| 699 void Debug::HandleWeakDebugInfo(v8::Persistent<v8::Value> obj, void* data) { | 701 void Debug::HandleWeakDebugInfo(v8::Isolate* isolate, |
| 700 Debug* debug = Isolate::Current()->debug(); | 702 v8::Persistent<v8::Value> obj, |
| 703 void* data) { |
| 704 Debug* debug = reinterpret_cast<Isolate*>(isolate)->debug(); |
| 701 DebugInfoListNode* node = reinterpret_cast<DebugInfoListNode*>(data); | 705 DebugInfoListNode* node = reinterpret_cast<DebugInfoListNode*>(data); |
| 702 // We need to clear all breakpoints associated with the function to restore | 706 // We need to clear all breakpoints associated with the function to restore |
| 703 // original code and avoid patching the code twice later because | 707 // original code and avoid patching the code twice later because |
| 704 // the function will live in the heap until next gc, and can be found by | 708 // the function will live in the heap until next gc, and can be found by |
| 705 // Debug::FindSharedFunctionInfoInScript. | 709 // Debug::FindSharedFunctionInfoInScript. |
| 706 BreakLocationIterator it(node->debug_info(), ALL_BREAK_LOCATIONS); | 710 BreakLocationIterator it(node->debug_info(), ALL_BREAK_LOCATIONS); |
| 707 it.ClearAllDebugBreak(); | 711 it.ClearAllDebugBreak(); |
| 708 debug->RemoveDebugInfo(node->debug_info()); | 712 debug->RemoveDebugInfo(node->debug_info()); |
| 709 #ifdef DEBUG | 713 #ifdef DEBUG |
| 710 node = debug->debug_info_list_; | 714 node = debug->debug_info_list_; |
| 711 while (node != NULL) { | 715 while (node != NULL) { |
| 712 ASSERT(node != reinterpret_cast<DebugInfoListNode*>(data)); | 716 ASSERT(node != reinterpret_cast<DebugInfoListNode*>(data)); |
| 713 node = node->next(); | 717 node = node->next(); |
| 714 } | 718 } |
| 715 #endif | 719 #endif |
| 716 } | 720 } |
| 717 | 721 |
| 718 | 722 |
| 719 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { | 723 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { |
| 720 GlobalHandles* global_handles = Isolate::Current()->global_handles(); | 724 GlobalHandles* global_handles = Isolate::Current()->global_handles(); |
| 721 // Globalize the request debug info object and make it weak. | 725 // Globalize the request debug info object and make it weak. |
| 722 debug_info_ = Handle<DebugInfo>::cast( | 726 debug_info_ = Handle<DebugInfo>::cast( |
| 723 (global_handles->Create(debug_info))); | 727 (global_handles->Create(debug_info))); |
| 724 global_handles->MakeWeak( | 728 global_handles->MakeWeak(reinterpret_cast<Object**>(debug_info_.location()), |
| 725 reinterpret_cast<Object**>(debug_info_.location()), | 729 this, |
| 726 this, | 730 NULL, |
| 727 Debug::HandleWeakDebugInfo); | 731 Debug::HandleWeakDebugInfo); |
| 728 } | 732 } |
| 729 | 733 |
| 730 | 734 |
| 731 DebugInfoListNode::~DebugInfoListNode() { | 735 DebugInfoListNode::~DebugInfoListNode() { |
| 732 Isolate::Current()->global_handles()->Destroy( | 736 Isolate::Current()->global_handles()->Destroy( |
| 733 reinterpret_cast<Object**>(debug_info_.location())); | 737 reinterpret_cast<Object**>(debug_info_.location())); |
| 734 } | 738 } |
| 735 | 739 |
| 736 | 740 |
| 737 bool Debug::CompileDebuggerScript(int index) { | 741 bool Debug::CompileDebuggerScript(int index) { |
| (...skipping 3039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3777 { | 3781 { |
| 3778 Locker locker(reinterpret_cast<v8::Isolate*>(isolate)); | 3782 Locker locker(reinterpret_cast<v8::Isolate*>(isolate)); |
| 3779 isolate->debugger()->CallMessageDispatchHandler(); | 3783 isolate->debugger()->CallMessageDispatchHandler(); |
| 3780 } | 3784 } |
| 3781 } | 3785 } |
| 3782 } | 3786 } |
| 3783 | 3787 |
| 3784 #endif // ENABLE_DEBUGGER_SUPPORT | 3788 #endif // ENABLE_DEBUGGER_SUPPORT |
| 3785 | 3789 |
| 3786 } } // namespace v8::internal | 3790 } } // namespace v8::internal |
| OLD | NEW |