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 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 reinterpret_cast<ScriptCache*>(data.GetParameter()); | 688 reinterpret_cast<ScriptCache*>(data.GetParameter()); |
689 HashMap::Entry* entry = script_cache->Lookup(key, hash, false); | 689 HashMap::Entry* entry = script_cache->Lookup(key, hash, false); |
690 Object** location = reinterpret_cast<Object**>(entry->value); | 690 Object** location = reinterpret_cast<Object**>(entry->value); |
691 script_cache->Remove(key, hash); | 691 script_cache->Remove(key, hash); |
692 | 692 |
693 // Clear the weak handle. | 693 // Clear the weak handle. |
694 GlobalHandles::Destroy(location); | 694 GlobalHandles::Destroy(location); |
695 } | 695 } |
696 | 696 |
697 | 697 |
698 void Debug::HandleWeakDebugInfo( | 698 void Debug::HandlePhantomDebugInfo( |
699 const v8::WeakCallbackData<v8::Value, void>& data) { | 699 const v8::PhantomCallbackData<DebugInfoListNode>& data) { |
700 Debug* debug = reinterpret_cast<Isolate*>(data.GetIsolate())->debug(); | 700 Debug* debug = reinterpret_cast<Isolate*>(data.GetIsolate())->debug(); |
701 DebugInfoListNode* node = | 701 DebugInfoListNode* node = data.GetParameter(); |
702 reinterpret_cast<DebugInfoListNode*>(data.GetParameter()); | 702 debug->RemoveDebugInfo(node); |
703 debug->RemoveDebugInfo(node->debug_info().location()); | |
704 #ifdef DEBUG | 703 #ifdef DEBUG |
705 for (DebugInfoListNode* n = debug->debug_info_list_; | 704 for (DebugInfoListNode* n = debug->debug_info_list_; |
706 n != NULL; | 705 n != NULL; |
707 n = n->next()) { | 706 n = n->next()) { |
708 DCHECK(n != node); | 707 DCHECK(n != node); |
709 } | 708 } |
710 #endif | 709 #endif |
711 } | 710 } |
712 | 711 |
713 | 712 |
714 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { | 713 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { |
715 // Globalize the request debug info object and make it weak. | 714 // Globalize the request debug info object and make it weak. |
716 GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles(); | 715 GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles(); |
717 debug_info_ = Handle<DebugInfo>::cast(global_handles->Create(debug_info)); | 716 debug_info_ = Handle<DebugInfo>::cast(global_handles->Create(debug_info)); |
718 GlobalHandles::MakeWeak(reinterpret_cast<Object**>(debug_info_.location()), | 717 typedef PhantomCallbackData<void>::Callback Callback; |
719 this, Debug::HandleWeakDebugInfo, | 718 GlobalHandles::MakePhantom( |
720 GlobalHandles::Phantom); | 719 reinterpret_cast<Object**>(debug_info_.location()), this, |
| 720 reinterpret_cast<Callback>(Debug::HandlePhantomDebugInfo)); |
721 } | 721 } |
722 | 722 |
723 | 723 |
724 DebugInfoListNode::~DebugInfoListNode() { | 724 DebugInfoListNode::~DebugInfoListNode() { |
725 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_.location())); | 725 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_.location())); |
726 } | 726 } |
727 | 727 |
728 | 728 |
729 bool Debug::CompileDebuggerScript(Isolate* isolate, int index) { | 729 bool Debug::CompileDebuggerScript(Isolate* isolate, int index) { |
730 Factory* factory = isolate->factory(); | 730 Factory* factory = isolate->factory(); |
(...skipping 1502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2233 | 2233 |
2234 // Add debug info to the list. | 2234 // Add debug info to the list. |
2235 DebugInfoListNode* node = new DebugInfoListNode(*debug_info); | 2235 DebugInfoListNode* node = new DebugInfoListNode(*debug_info); |
2236 node->set_next(debug_info_list_); | 2236 node->set_next(debug_info_list_); |
2237 debug_info_list_ = node; | 2237 debug_info_list_ = node; |
2238 | 2238 |
2239 return true; | 2239 return true; |
2240 } | 2240 } |
2241 | 2241 |
2242 | 2242 |
2243 // This uses the location of a handle to look up the debug info in the debug | 2243 void Debug::RemoveDebugInfo(DebugInfoListNode* prev, DebugInfoListNode* node) { |
2244 // info list, but it doesn't use the actual debug info for anything. Therefore | 2244 // Unlink from list. If prev is NULL we are looking at the first element. |
2245 // if the debug info has been collected by the GC, we can be sure that this | 2245 if (prev == NULL) { |
2246 // method will not attempt to resurrect it. | 2246 debug_info_list_ = node->next(); |
| 2247 } else { |
| 2248 prev->set_next(node->next()); |
| 2249 } |
| 2250 delete node; |
| 2251 |
| 2252 // If there are no more debug info objects there are not more break |
| 2253 // points. |
| 2254 has_break_points_ = debug_info_list_ != NULL; |
| 2255 } |
| 2256 |
| 2257 |
2247 void Debug::RemoveDebugInfo(DebugInfo** debug_info) { | 2258 void Debug::RemoveDebugInfo(DebugInfo** debug_info) { |
2248 DCHECK(debug_info_list_ != NULL); | 2259 DCHECK(debug_info_list_ != NULL); |
2249 // Run through the debug info objects to find this one and remove it. | 2260 // Run through the debug info objects to find this one and remove it. |
2250 DebugInfoListNode* prev = NULL; | 2261 DebugInfoListNode* prev = NULL; |
2251 DebugInfoListNode* current = debug_info_list_; | 2262 DebugInfoListNode* current = debug_info_list_; |
2252 while (current != NULL) { | 2263 while (current != NULL) { |
2253 if (current->debug_info().location() == debug_info) { | 2264 if (current->debug_info().location() == debug_info) { |
2254 // Unlink from list. If prev is NULL we are looking at the first element. | 2265 RemoveDebugInfo(prev, current); |
2255 if (prev == NULL) { | |
2256 debug_info_list_ = current->next(); | |
2257 } else { | |
2258 prev->set_next(current->next()); | |
2259 } | |
2260 delete current; | |
2261 | |
2262 // If there are no more debug info objects there are not more break | |
2263 // points. | |
2264 has_break_points_ = debug_info_list_ != NULL; | |
2265 | |
2266 return; | 2266 return; |
2267 } | 2267 } |
2268 // Move to next in list. | 2268 // Move to next in list. |
| 2269 prev = current; |
| 2270 current = current->next(); |
| 2271 } |
| 2272 UNREACHABLE(); |
| 2273 } |
| 2274 |
| 2275 |
| 2276 void Debug::RemoveDebugInfo(DebugInfoListNode* node) { |
| 2277 DCHECK(debug_info_list_ != NULL); |
| 2278 // Run through the debug info objects to find this one and remove it. |
| 2279 DebugInfoListNode* prev = NULL; |
| 2280 DebugInfoListNode* current = debug_info_list_; |
| 2281 while (current != NULL) { |
| 2282 if (current == node) { |
| 2283 RemoveDebugInfo(prev, node); |
| 2284 return; |
| 2285 } |
| 2286 // Move to next in list. |
2269 prev = current; | 2287 prev = current; |
2270 current = current->next(); | 2288 current = current->next(); |
2271 } | 2289 } |
2272 UNREACHABLE(); | 2290 UNREACHABLE(); |
2273 } | 2291 } |
2274 | 2292 |
2275 | 2293 |
2276 void Debug::RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info) { | 2294 void Debug::RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info) { |
2277 HandleScope scope(isolate_); | 2295 HandleScope scope(isolate_); |
2278 Handle<SharedFunctionInfo> shared(debug_info->shared()); | 2296 Handle<SharedFunctionInfo> shared(debug_info->shared()); |
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3474 logger_->DebugEvent("Put", message.text()); | 3492 logger_->DebugEvent("Put", message.text()); |
3475 } | 3493 } |
3476 | 3494 |
3477 | 3495 |
3478 void LockingCommandMessageQueue::Clear() { | 3496 void LockingCommandMessageQueue::Clear() { |
3479 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 3497 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
3480 queue_.Clear(); | 3498 queue_.Clear(); |
3481 } | 3499 } |
3482 | 3500 |
3483 } } // namespace v8::internal | 3501 } } // namespace v8::internal |
OLD | NEW |