Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(948)

Side by Side Diff: src/debug.cc

Issue 115462: Add a script cache to the debugger... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 #ifdef DEBUG 418 #ifdef DEBUG
419 ASSERT(reloc_iterator_->done() == reloc_iterator_original_->done()); 419 ASSERT(reloc_iterator_->done() == reloc_iterator_original_->done());
420 if (!reloc_iterator_->done()) { 420 if (!reloc_iterator_->done()) {
421 ASSERT(rmode() == original_rmode()); 421 ASSERT(rmode() == original_rmode());
422 } 422 }
423 #endif 423 #endif
424 } 424 }
425 425
426 426
427 bool Debug::has_break_points_ = false; 427 bool Debug::has_break_points_ = false;
428 ScriptCache* Debug::script_cache_ = NULL;
428 DebugInfoListNode* Debug::debug_info_list_ = NULL; 429 DebugInfoListNode* Debug::debug_info_list_ = NULL;
429 430
430 431
431 // Threading support. 432 // Threading support.
432 void Debug::ThreadInit() { 433 void Debug::ThreadInit() {
433 thread_local_.break_count_ = 0; 434 thread_local_.break_count_ = 0;
434 thread_local_.break_id_ = 0; 435 thread_local_.break_id_ = 0;
435 thread_local_.break_frame_id_ = StackFrame::NO_ID; 436 thread_local_.break_frame_id_ = StackFrame::NO_ID;
436 thread_local_.last_step_action_ = StepNone; 437 thread_local_.last_step_action_ = StepNone;
437 thread_local_.last_statement_position_ = RelocInfo::kNoPosition; 438 thread_local_.last_statement_position_ = RelocInfo::kNoPosition;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 480
480 // Default call debugger on uncaught exception. 481 // Default call debugger on uncaught exception.
481 bool Debug::break_on_exception_ = false; 482 bool Debug::break_on_exception_ = false;
482 bool Debug::break_on_uncaught_exception_ = true; 483 bool Debug::break_on_uncaught_exception_ = true;
483 484
484 Handle<Context> Debug::debug_context_ = Handle<Context>(); 485 Handle<Context> Debug::debug_context_ = Handle<Context>();
485 Code* Debug::debug_break_return_entry_ = NULL; 486 Code* Debug::debug_break_return_entry_ = NULL;
486 Code* Debug::debug_break_return_ = NULL; 487 Code* Debug::debug_break_return_ = NULL;
487 488
488 489
490 void ScriptCache::Add(Handle<Script> script) {
491 // Create an entry in the hash map for the script.
492 int id = Smi::cast(script->id())->value();
493 HashMap::Entry* entry =
494 HashMap::Lookup(reinterpret_cast<void*>(id), Hash(id), true);
495 if (entry->value != NULL) {
496 ASSERT(*script == *reinterpret_cast<Script**>(entry->value));
497 return;
498 }
499
500 // Globalize the script object, make it weak and use the location of the
501 // global handle as the value in the hash map.
502 Handle<Script> script_ =
503 Handle<Script>::cast((GlobalHandles::Create(*script)));
504 GlobalHandles::MakeWeak(reinterpret_cast<Object**>(script_.location()),
505 this, ScriptCache::HandleWeakScript);
506 entry->value = script_.location();
507 }
508
509
510 Handle<FixedArray> ScriptCache::GetScripts() {
511 Handle<FixedArray> instances = Factory::NewFixedArray(occupancy());
512 int count = 0;
513 for (HashMap::Entry* entry = Start(); entry != NULL; entry = Next(entry)) {
514 ASSERT(entry->value != NULL);
515 if (entry->value != NULL) {
516 instances->set(count, *reinterpret_cast<Script**>(entry->value));
517 count++;
518 }
519 }
520 return instances;
521 }
522
523
524 void ScriptCache::ProcessCollectedScripts() {
525 for (int i = 0; i < collected_scripts_.length(); i++) {
526 Debugger::OnScriptCollected(collected_scripts_[i]);
527 }
528 collected_scripts_.Clear();
529 }
530
531
532 void ScriptCache::Clear() {
533 // Iterate the script cache to get rid of all the weak handles.
534 for (HashMap::Entry* entry = Start(); entry != NULL; entry = Next(entry)) {
535 ASSERT(entry != NULL);
536 Object** location = reinterpret_cast<Object**>(entry->value);
537 ASSERT((*location)->IsScript());
538 GlobalHandles::ClearWeakness(location);
539 GlobalHandles::Destroy(location);
540 }
541 // Clear the content of the hash map.
542 HashMap::Clear();
543 }
544
545
546 void ScriptCache::HandleWeakScript(v8::Persistent<v8::Value> obj, void* data) {
547 ScriptCache* script_cache = reinterpret_cast<ScriptCache*>(data);
548 // Find the location of the global handle.
549 Script** location =
550 reinterpret_cast<Script**>(Utils::OpenHandle(*obj).location());
551 ASSERT((*location)->IsScript());
552
553 HandleScope scope;
Mads Ager (chromium) 2009/05/18 12:57:00 Why do you need to create this handle to the scrip
Søren Thygesen Gjesse 2009/05/18 13:13:17 I don't - unused code.
554 Handle<Script> script(location);
555
556 // Remove the entry from the cache.
557 int id = Smi::cast((*location)->id())->value();
558 script_cache->Remove(reinterpret_cast<void*>(id), Hash(id));
559 script_cache->collected_scripts_.Add(id);
560
561 // Clear the weak handle.
562 obj.Dispose();
563 obj.Clear();
564 }
565
566
567 void Debug::Setup(bool create_heap_objects) {
568 ThreadInit();
569 if (create_heap_objects) {
570 // Get code to handle entry to debug break on return.
571 debug_break_return_entry_ =
572 Builtins::builtin(Builtins::Return_DebugBreakEntry);
573 ASSERT(debug_break_return_entry_->IsCode());
574
575 // Get code to handle debug break on return.
576 debug_break_return_ =
577 Builtins::builtin(Builtins::Return_DebugBreak);
578 ASSERT(debug_break_return_->IsCode());
579 }
580 }
581
582
489 void Debug::HandleWeakDebugInfo(v8::Persistent<v8::Value> obj, void* data) { 583 void Debug::HandleWeakDebugInfo(v8::Persistent<v8::Value> obj, void* data) {
490 DebugInfoListNode* node = reinterpret_cast<DebugInfoListNode*>(data); 584 DebugInfoListNode* node = reinterpret_cast<DebugInfoListNode*>(data);
491 RemoveDebugInfo(node->debug_info()); 585 RemoveDebugInfo(node->debug_info());
492 #ifdef DEBUG 586 #ifdef DEBUG
493 node = Debug::debug_info_list_; 587 node = Debug::debug_info_list_;
494 while (node != NULL) { 588 while (node != NULL) {
495 ASSERT(node != reinterpret_cast<DebugInfoListNode*>(data)); 589 ASSERT(node != reinterpret_cast<DebugInfoListNode*>(data));
496 node = node->next(); 590 node = node->next();
497 } 591 }
498 #endif 592 #endif
499 } 593 }
500 594
501 595
502 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) { 596 DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) {
503 // Globalize the request debug info object and make it weak. 597 // Globalize the request debug info object and make it weak.
504 debug_info_ = Handle<DebugInfo>::cast((GlobalHandles::Create(debug_info))); 598 debug_info_ = Handle<DebugInfo>::cast((GlobalHandles::Create(debug_info)));
505 GlobalHandles::MakeWeak(reinterpret_cast<Object**>(debug_info_.location()), 599 GlobalHandles::MakeWeak(reinterpret_cast<Object**>(debug_info_.location()),
506 this, Debug::HandleWeakDebugInfo); 600 this, Debug::HandleWeakDebugInfo);
507 } 601 }
508 602
509 603
510 DebugInfoListNode::~DebugInfoListNode() { 604 DebugInfoListNode::~DebugInfoListNode() {
511 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_.location())); 605 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_.location()));
512 } 606 }
513 607
514 608
515 void Debug::Setup(bool create_heap_objects) {
516 ThreadInit();
517 if (create_heap_objects) {
518 // Get code to handle entry to debug break on return.
519 debug_break_return_entry_ =
520 Builtins::builtin(Builtins::Return_DebugBreakEntry);
521 ASSERT(debug_break_return_entry_->IsCode());
522
523 // Get code to handle debug break on return.
524 debug_break_return_ =
525 Builtins::builtin(Builtins::Return_DebugBreak);
526 ASSERT(debug_break_return_->IsCode());
527 }
528 }
529
530
531 bool Debug::CompileDebuggerScript(int index) { 609 bool Debug::CompileDebuggerScript(int index) {
532 HandleScope scope; 610 HandleScope scope;
533 611
534 // Bail out if the index is invalid. 612 // Bail out if the index is invalid.
535 if (index == -1) { 613 if (index == -1) {
536 return false; 614 return false;
537 } 615 }
538 616
539 // Find source and name for the requested script. 617 // Find source and name for the requested script.
540 Handle<String> source_code = Bootstrapper::NativesSourceLookup(index); 618 Handle<String> source_code = Bootstrapper::NativesSourceLookup(index);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 698
621 // Make sure we mark the debugger as not loading before we might 699 // Make sure we mark the debugger as not loading before we might
622 // return. 700 // return.
623 Debugger::set_loading_debugger(false); 701 Debugger::set_loading_debugger(false);
624 702
625 // Check for caught exceptions. 703 // Check for caught exceptions.
626 if (caught_exception) return false; 704 if (caught_exception) return false;
627 705
628 // Debugger loaded. 706 // Debugger loaded.
629 debug_context_ = Handle<Context>::cast(GlobalHandles::Create(*context)); 707 debug_context_ = Handle<Context>::cast(GlobalHandles::Create(*context));
708
630 return true; 709 return true;
631 } 710 }
632 711
633 712
634 void Debug::Unload() { 713 void Debug::Unload() {
635 // Return debugger is not loaded. 714 // Return debugger is not loaded.
636 if (!IsLoaded()) { 715 if (!IsLoaded()) {
637 return; 716 return;
638 } 717 }
639 718
719 // Clear the script cache.
720 DestroyScriptCache();
721
640 // Clear debugger context global handle. 722 // Clear debugger context global handle.
641 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_context_.location())); 723 GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_context_.location()));
642 debug_context_ = Handle<Context>(); 724 debug_context_ = Handle<Context>();
643 } 725 }
644 726
645 727
646 // Set the flag indicating that preemption happened during debugging. 728 // Set the flag indicating that preemption happened during debugging.
647 void Debug::PreemptionWhileInDebugger() { 729 void Debug::PreemptionWhileInDebugger() {
648 ASSERT(InDebugger()); 730 ASSERT(InDebugger());
649 Debug::set_preemption_pending(true); 731 Debug::set_preemption_pending(true);
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
1407 Handle<Object> fun(Top::global()->GetProperty(*function_name)); 1489 Handle<Object> fun(Top::global()->GetProperty(*function_name));
1408 ASSERT(fun->IsJSFunction()); 1490 ASSERT(fun->IsJSFunction());
1409 bool caught_exception; 1491 bool caught_exception;
1410 Handle<Object> js_object = Execution::TryCall( 1492 Handle<Object> js_object = Execution::TryCall(
1411 Handle<JSFunction>::cast(fun), 1493 Handle<JSFunction>::cast(fun),
1412 Handle<JSObject>(Debug::debug_context()->global()), 1494 Handle<JSObject>(Debug::debug_context()->global()),
1413 0, NULL, &caught_exception); 1495 0, NULL, &caught_exception);
1414 } 1496 }
1415 1497
1416 1498
1499 // If an object given is an external string, check that the underlying
1500 // resource is accessible. For other kinds of objects, always return true.
1501 static bool IsExternalStringValid(Object* str) {
1502 if (!str->IsString() || !StringShape(String::cast(str)).IsExternal()) {
1503 return true;
1504 }
1505 if (String::cast(str)->IsAsciiRepresentation()) {
1506 return ExternalAsciiString::cast(str)->resource() != NULL;
1507 } else if (String::cast(str)->IsTwoByteRepresentation()) {
1508 return ExternalTwoByteString::cast(str)->resource() != NULL;
1509 } else {
1510 return true;
1511 }
1512 }
1513
1514
1515 void Debug::CreateScriptCache() {
1516 HandleScope scope;
1517
1518 // Perform two GCs to get rid of all unreferenced scripts. The first GC gets
1519 // rid of all the cached script wrappers and the second gets rid of the
1520 // scripts which is no longer referenced.
1521 Heap::CollectAllGarbage();
1522 Heap::CollectAllGarbage();
1523
1524 ASSERT(script_cache_ == NULL);
1525 script_cache_ = new ScriptCache();
1526
1527 // Scan heap for Script objects.
1528 int count = 0;
1529 HeapIterator iterator;
1530 while (iterator.has_next()) {
1531 HeapObject* obj = iterator.next();
1532 ASSERT(obj != NULL);
1533 if (obj->IsScript() && IsExternalStringValid(Script::cast(obj)->source())) {
1534 script_cache_->Add(Handle<Script>(Script::cast(obj)));
1535 count++;
1536 }
1537 }
1538 }
1539
1540
1541 void Debug::DestroyScriptCache() {
1542 // Get rid of the script cache if it was created.
1543 if (script_cache_ != NULL) {
1544 delete script_cache_;
1545 script_cache_ = NULL;
1546 }
1547 }
1548
1549
1550 void Debug::AddScriptToScriptCache(Handle<Script> script) {
1551 if (script_cache_ != NULL) {
1552 script_cache_->Add(script);
1553 }
1554 }
1555
1556
1557 Handle<FixedArray> Debug::GetLoadedScripts() {
1558 // Create and fill the script cache when the loaded scripts is requested for
1559 // the first time.
1560 if (script_cache_ == NULL) {
1561 CreateScriptCache();
1562 }
1563
1564 // If the script cache is not active just return an empty array.
1565 ASSERT(script_cache_ != NULL);
1566 if (script_cache_ == NULL) {
1567 Factory::NewFixedArray(0);
1568 }
1569
1570 // Perform GC to get unreferenced scripts evicted from the cache before before
Mads Ager (chromium) 2009/05/18 12:57:00 before before -> before
Søren Thygesen Gjesse 2009/05/18 13:13:17 Done.
1571 // returning the content.
1572 Heap::CollectAllGarbage();
1573
1574 // Get the scripts from the cache.
1575 return script_cache_->GetScripts();
1576 }
1577
1578
1579 void Debug::AfterGarbageCollection() {
1580 // Generate events for collected scripts.
1581 if (script_cache_ != NULL) {
1582 script_cache_->ProcessCollectedScripts();
1583 }
1584 }
1585
1586
1417 Mutex* Debugger::debugger_access_ = OS::CreateMutex(); 1587 Mutex* Debugger::debugger_access_ = OS::CreateMutex();
1418 Handle<Object> Debugger::event_listener_ = Handle<Object>(); 1588 Handle<Object> Debugger::event_listener_ = Handle<Object>();
1419 Handle<Object> Debugger::event_listener_data_ = Handle<Object>(); 1589 Handle<Object> Debugger::event_listener_data_ = Handle<Object>();
1420 bool Debugger::compiling_natives_ = false; 1590 bool Debugger::compiling_natives_ = false;
1421 bool Debugger::is_loading_debugger_ = false; 1591 bool Debugger::is_loading_debugger_ = false;
1422 bool Debugger::never_unload_debugger_ = false; 1592 bool Debugger::never_unload_debugger_ = false;
1423 v8::Debug::MessageHandler2 Debugger::message_handler_ = NULL; 1593 v8::Debug::MessageHandler2 Debugger::message_handler_ = NULL;
1424 bool Debugger::message_handler_cleared_ = false; 1594 bool Debugger::message_handler_cleared_ = false;
1425 v8::Debug::HostDispatchHandler Debugger::host_dispatch_handler_ = NULL; 1595 v8::Debug::HostDispatchHandler Debugger::host_dispatch_handler_ = NULL;
1426 int Debugger::host_dispatch_micros_ = 100 * 1000; 1596 int Debugger::host_dispatch_micros_ = 100 * 1000;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1511 before ? Factory::true_value().location() : 1681 before ? Factory::true_value().location() :
1512 Factory::false_value().location() }; 1682 Factory::false_value().location() };
1513 1683
1514 return MakeJSObject(CStrVector("MakeCompileEvent"), 1684 return MakeJSObject(CStrVector("MakeCompileEvent"),
1515 argc, 1685 argc,
1516 argv, 1686 argv,
1517 caught_exception); 1687 caught_exception);
1518 } 1688 }
1519 1689
1520 1690
1691 Handle<Object> Debugger::MakeScriptCollectedEvent(int id,
1692 bool* caught_exception) {
1693 // Create the script collected event object.
1694 Handle<Object> exec_state = MakeExecutionState(caught_exception);
1695 Handle<Object> id_object = Handle<Smi>(Smi::FromInt(id));
1696 const int argc = 2;
1697 Object** argv[argc] = { exec_state.location(), id_object.location() };
1698
1699 return MakeJSObject(CStrVector("MakeScriptCollectedEvent"),
1700 argc,
1701 argv,
1702 caught_exception);
1703 }
1704
1705
1521 void Debugger::OnException(Handle<Object> exception, bool uncaught) { 1706 void Debugger::OnException(Handle<Object> exception, bool uncaught) {
1522 HandleScope scope; 1707 HandleScope scope;
1523 1708
1524 // Bail out based on state or if there is no listener for this event 1709 // Bail out based on state or if there is no listener for this event
1525 if (Debug::InDebugger()) return; 1710 if (Debug::InDebugger()) return;
1526 if (!Debugger::EventActive(v8::Exception)) return; 1711 if (!Debugger::EventActive(v8::Exception)) return;
1527 1712
1528 // Bail out if exception breaks are not active 1713 // Bail out if exception breaks are not active
1529 if (uncaught) { 1714 if (uncaught) {
1530 // Uncaught exceptions are reported by either flags. 1715 // Uncaught exceptions are reported by either flags.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1617 ProcessDebugEvent(v8::BeforeCompile, 1802 ProcessDebugEvent(v8::BeforeCompile,
1618 Handle<JSObject>::cast(event_data), 1803 Handle<JSObject>::cast(event_data),
1619 true); 1804 true);
1620 } 1805 }
1621 1806
1622 1807
1623 // Handle debugger actions when a new script is compiled. 1808 // Handle debugger actions when a new script is compiled.
1624 void Debugger::OnAfterCompile(Handle<Script> script, Handle<JSFunction> fun) { 1809 void Debugger::OnAfterCompile(Handle<Script> script, Handle<JSFunction> fun) {
1625 HandleScope scope; 1810 HandleScope scope;
1626 1811
1812 // Add the newly compiled script to the script cache.
1813 Debug::AddScriptToScriptCache(script);
1814
1815 // No more to do if not debugging.
1816 if (!IsDebuggerActive()) return;
1817
1627 // No compile events while compiling natives. 1818 // No compile events while compiling natives.
1628 if (compiling_natives()) return; 1819 if (compiling_natives()) return;
1629 1820
1630 // No more to do if not debugging.
1631 if (!IsDebuggerActive()) return;
1632
1633 // Store whether in debugger before entering debugger. 1821 // Store whether in debugger before entering debugger.
1634 bool in_debugger = Debug::InDebugger(); 1822 bool in_debugger = Debug::InDebugger();
1635 1823
1636 // Enter the debugger. 1824 // Enter the debugger.
1637 EnterDebugger debugger; 1825 EnterDebugger debugger;
1638 if (debugger.FailedToEnter()) return; 1826 if (debugger.FailedToEnter()) return;
1639 1827
1640 // If debugging there might be script break points registered for this 1828 // If debugging there might be script break points registered for this
1641 // script. Make sure that these break points are set. 1829 // script. Make sure that these break points are set.
1642 1830
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 Handle<Object> event_data = MakeNewFunctionEvent(function, &caught_exception); 1889 Handle<Object> event_data = MakeNewFunctionEvent(function, &caught_exception);
1702 // Bail out and don't call debugger if exception. 1890 // Bail out and don't call debugger if exception.
1703 if (caught_exception) { 1891 if (caught_exception) {
1704 return; 1892 return;
1705 } 1893 }
1706 // Process debug event. 1894 // Process debug event.
1707 ProcessDebugEvent(v8::NewFunction, Handle<JSObject>::cast(event_data), true); 1895 ProcessDebugEvent(v8::NewFunction, Handle<JSObject>::cast(event_data), true);
1708 } 1896 }
1709 1897
1710 1898
1899 void Debugger::OnScriptCollected(int id) {
1900 HandleScope scope;
1901
1902 // No more to do if not debugging.
1903 if (!IsDebuggerActive()) return;
1904 if (!Debugger::EventActive(v8::ScriptCollected)) return;
1905
1906 // Enter the debugger.
1907 EnterDebugger debugger;
1908 if (debugger.FailedToEnter()) return;
1909
1910 // Create the script collected state object.
1911 bool caught_exception = false;
1912 Handle<Object> event_data = MakeScriptCollectedEvent(id,
1913 &caught_exception);
1914 // Bail out and don't call debugger if exception.
1915 if (caught_exception) {
1916 return;
1917 }
1918
1919 // Process debug event.
1920 ProcessDebugEvent(v8::ScriptCollected,
1921 Handle<JSObject>::cast(event_data),
1922 true);
1923 }
1924
1925
1711 void Debugger::ProcessDebugEvent(v8::DebugEvent event, 1926 void Debugger::ProcessDebugEvent(v8::DebugEvent event,
1712 Handle<JSObject> event_data, 1927 Handle<JSObject> event_data,
1713 bool auto_continue) { 1928 bool auto_continue) {
1714 HandleScope scope; 1929 HandleScope scope;
1715 1930
1716 // Create the execution state. 1931 // Create the execution state.
1717 bool caught_exception = false; 1932 bool caught_exception = false;
1718 Handle<Object> exec_state = MakeExecutionState(&caught_exception); 1933 Handle<Object> exec_state = MakeExecutionState(&caught_exception);
1719 if (caught_exception) { 1934 if (caught_exception) {
1720 return; 1935 return;
(...skipping 28 matching lines...) Expand all
1749 exec_state.location(), 1964 exec_state.location(),
1750 Handle<Object>::cast(event_data).location(), 1965 Handle<Object>::cast(event_data).location(),
1751 event_listener_data_.location() }; 1966 event_listener_data_.location() };
1752 Handle<Object> result = Execution::TryCall(fun, Top::global(), 1967 Handle<Object> result = Execution::TryCall(fun, Top::global(),
1753 argc, argv, &caught_exception); 1968 argc, argv, &caught_exception);
1754 if (caught_exception) { 1969 if (caught_exception) {
1755 // Silently ignore exceptions from debug event listeners. 1970 // Silently ignore exceptions from debug event listeners.
1756 } 1971 }
1757 } 1972 }
1758 } 1973 }
1759
1760 // Clear the mirror cache.
1761 Debug::ClearMirrorCache();
1762 } 1974 }
1763 1975
1764 1976
1765 void Debugger::UnloadDebugger() { 1977 void Debugger::UnloadDebugger() {
1766 // Make sure that there are no breakpoints left. 1978 // Make sure that there are no breakpoints left.
1767 Debug::ClearAllBreakPoints(); 1979 Debug::ClearAllBreakPoints();
1768 1980
1769 // Unload the debugger if feasible. 1981 // Unload the debugger if feasible.
1770 if (!never_unload_debugger_) { 1982 if (!never_unload_debugger_) {
1771 Debug::Unload(); 1983 Debug::Unload();
(...skipping 19 matching lines...) Expand all
1791 sendEventMessage = !auto_continue; 2003 sendEventMessage = !auto_continue;
1792 break; 2004 break;
1793 case v8::Exception: 2005 case v8::Exception:
1794 sendEventMessage = true; 2006 sendEventMessage = true;
1795 break; 2007 break;
1796 case v8::BeforeCompile: 2008 case v8::BeforeCompile:
1797 break; 2009 break;
1798 case v8::AfterCompile: 2010 case v8::AfterCompile:
1799 sendEventMessage = true; 2011 sendEventMessage = true;
1800 break; 2012 break;
2013 case v8::ScriptCollected:
2014 sendEventMessage = true;
2015 break;
1801 case v8::NewFunction: 2016 case v8::NewFunction:
1802 break; 2017 break;
1803 default: 2018 default:
1804 UNREACHABLE(); 2019 UNREACHABLE();
1805 } 2020 }
1806 2021
1807 // The debug command interrupt flag might have been set when the command was 2022 // The debug command interrupt flag might have been set when the command was
1808 // added. It should be enough to clear the flag only once while we are in the 2023 // added. It should be enough to clear the flag only once while we are in the
1809 // debugger. 2024 // debugger.
1810 ASSERT(Debug::InDebugger()); 2025 ASSERT(Debug::InDebugger());
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
2289 2504
2290 2505
2291 void LockingCommandMessageQueue::Clear() { 2506 void LockingCommandMessageQueue::Clear() {
2292 ScopedLock sl(lock_); 2507 ScopedLock sl(lock_);
2293 queue_.Clear(); 2508 queue_.Clear();
2294 } 2509 }
2295 2510
2296 #endif // ENABLE_DEBUGGER_SUPPORT 2511 #endif // ENABLE_DEBUGGER_SUPPORT
2297 2512
2298 } } // namespace v8::internal 2513 } } // namespace v8::internal
OLDNEW
« src/debug.h ('K') | « src/debug.h ('k') | src/debug-delay.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698