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

Side by Side Diff: src/debug.cc

Issue 100034: Support afterCompile event (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 8 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
« no previous file with comments | « no previous file | src/debug-delay.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1594 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 1605
1606 // Create the event data object. 1606 // Create the event data object.
1607 bool caught_exception = false; 1607 bool caught_exception = false;
1608 Handle<Object> event_data = MakeCompileEvent(script, true, &caught_exception); 1608 Handle<Object> event_data = MakeCompileEvent(script, true, &caught_exception);
1609 // Bail out and don't call debugger if exception. 1609 // Bail out and don't call debugger if exception.
1610 if (caught_exception) { 1610 if (caught_exception) {
1611 return; 1611 return;
1612 } 1612 }
1613 1613
1614 // Process debug event 1614 // Process debug event
1615 ProcessDebugEvent(v8::BeforeCompile, event_data, false); 1615 ProcessDebugEvent(v8::BeforeCompile, event_data, true);
1616 } 1616 }
1617 1617
1618 1618
1619 // Handle debugger actions when a new script is compiled. 1619 // Handle debugger actions when a new script is compiled.
1620 void Debugger::OnAfterCompile(Handle<Script> script, Handle<JSFunction> fun) { 1620 void Debugger::OnAfterCompile(Handle<Script> script, Handle<JSFunction> fun) {
1621 HandleScope scope; 1621 HandleScope scope;
1622 1622
1623 // No compile events while compiling natives. 1623 // No compile events while compiling natives.
1624 if (compiling_natives()) return; 1624 if (compiling_natives()) return;
1625 1625
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1666 1666
1667 // Create the compile state object. 1667 // Create the compile state object.
1668 Handle<Object> event_data = MakeCompileEvent(script, 1668 Handle<Object> event_data = MakeCompileEvent(script,
1669 false, 1669 false,
1670 &caught_exception); 1670 &caught_exception);
1671 // Bail out and don't call debugger if exception. 1671 // Bail out and don't call debugger if exception.
1672 if (caught_exception) { 1672 if (caught_exception) {
1673 return; 1673 return;
1674 } 1674 }
1675 // Process debug event 1675 // Process debug event
1676 ProcessDebugEvent(v8::AfterCompile, event_data, false); 1676 ProcessDebugEvent(v8::AfterCompile, event_data, true);
1677 } 1677 }
1678 1678
1679 1679
1680 void Debugger::OnNewFunction(Handle<JSFunction> function) { 1680 void Debugger::OnNewFunction(Handle<JSFunction> function) {
1681 return; 1681 return;
1682 HandleScope scope; 1682 HandleScope scope;
1683 1683
1684 // Bail out based on state or if there is no listener for this event 1684 // Bail out based on state or if there is no listener for this event
1685 if (Debug::InDebugger()) return; 1685 if (Debug::InDebugger()) return;
1686 if (compiling_natives()) return; 1686 if (compiling_natives()) return;
1687 if (!Debugger::EventActive(v8::NewFunction)) return; 1687 if (!Debugger::EventActive(v8::NewFunction)) return;
1688 1688
1689 // Enter the debugger. 1689 // Enter the debugger.
1690 EnterDebugger debugger; 1690 EnterDebugger debugger;
1691 if (debugger.FailedToEnter()) return; 1691 if (debugger.FailedToEnter()) return;
1692 1692
1693 // Create the event object. 1693 // Create the event object.
1694 bool caught_exception = false; 1694 bool caught_exception = false;
1695 Handle<Object> event_data = MakeNewFunctionEvent(function, &caught_exception); 1695 Handle<Object> event_data = MakeNewFunctionEvent(function, &caught_exception);
1696 // Bail out and don't call debugger if exception. 1696 // Bail out and don't call debugger if exception.
1697 if (caught_exception) { 1697 if (caught_exception) {
1698 return; 1698 return;
1699 } 1699 }
1700 // Process debug event. 1700 // Process debug event.
1701 ProcessDebugEvent(v8::NewFunction, event_data, false); 1701 ProcessDebugEvent(v8::NewFunction, event_data, true);
1702 } 1702 }
1703 1703
1704 1704
1705 void Debugger::ProcessDebugEvent(v8::DebugEvent event, 1705 void Debugger::ProcessDebugEvent(v8::DebugEvent event,
1706 Handle<Object> event_data, 1706 Handle<Object> event_data,
1707 bool auto_continue) { 1707 bool auto_continue) {
1708 HandleScope scope; 1708 HandleScope scope;
1709 1709
1710 // Create the execution state. 1710 // Create the execution state.
1711 bool caught_exception = false; 1711 bool caught_exception = false;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1769 1769
1770 void Debugger::NotifyMessageHandler(v8::DebugEvent event, 1770 void Debugger::NotifyMessageHandler(v8::DebugEvent event,
1771 Handle<Object> exec_state, 1771 Handle<Object> exec_state,
1772 Handle<Object> event_data, 1772 Handle<Object> event_data,
1773 bool auto_continue) { 1773 bool auto_continue) {
1774 HandleScope scope; 1774 HandleScope scope;
1775 1775
1776 if (!Debug::Load()) return; 1776 if (!Debug::Load()) return;
1777 1777
1778 // Process the individual events. 1778 // Process the individual events.
1779 bool interactive = false; 1779 bool sendEventMessage = false;
1780 switch (event) { 1780 switch (event) {
1781 case v8::Break: 1781 case v8::Break:
1782 interactive = true; // Break event is always interactive 1782 sendEventMessage = !auto_continue;
1783 break; 1783 break;
1784 case v8::Exception: 1784 case v8::Exception:
1785 interactive = true; // Exception event is always interactive 1785 sendEventMessage = true;
1786 break; 1786 break;
1787 case v8::BeforeCompile: 1787 case v8::BeforeCompile:
1788 break; 1788 break;
1789 case v8::AfterCompile: 1789 case v8::AfterCompile:
1790 sendEventMessage = true;
1790 break; 1791 break;
1791 case v8::NewFunction: 1792 case v8::NewFunction:
1792 break; 1793 break;
1793 default: 1794 default:
1794 UNREACHABLE(); 1795 UNREACHABLE();
1795 } 1796 }
1796 1797
1797 // Done if not interactive. 1798 // The debug command interrupt flag might have been set when the command was
1798 if (!interactive) return; 1799 // added. It should be enough to clear the flag only once while we are in the
1800 // debugger.
1801 ASSERT(Debug::InDebugger());
1802 StackGuard::Continue(DEBUGCOMMAND);
1803
1804 // Notify the debugger that a debug event has occurred unless auto continue is
1805 // active in which case no event is send.
1806 if (sendEventMessage) {
1807 InvokeMessageHandlerWithEvent(event_data);
1808 }
1809 if (auto_continue && !HasCommands()) {
1810 return;
1811 }
1799 1812
1800 // Get the DebugCommandProcessor. 1813 // Get the DebugCommandProcessor.
1801 v8::Local<v8::Object> api_exec_state = 1814 v8::Local<v8::Object> api_exec_state =
1802 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state)); 1815 v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state));
1803 v8::Local<v8::String> fun_name = 1816 v8::Local<v8::String> fun_name =
1804 v8::String::New("debugCommandProcessor"); 1817 v8::String::New("debugCommandProcessor");
1805 v8::Local<v8::Function> fun = 1818 v8::Local<v8::Function> fun =
1806 v8::Function::Cast(*api_exec_state->Get(fun_name)); 1819 v8::Function::Cast(*api_exec_state->Get(fun_name));
1807 v8::TryCatch try_catch; 1820 v8::TryCatch try_catch;
1808 v8::Local<v8::Object> cmd_processor = 1821 v8::Local<v8::Object> cmd_processor =
1809 v8::Object::Cast(*fun->Call(api_exec_state, 0, NULL)); 1822 v8::Object::Cast(*fun->Call(api_exec_state, 0, NULL));
1810 if (try_catch.HasCaught()) { 1823 if (try_catch.HasCaught()) {
1811 PrintLn(try_catch.Exception()); 1824 PrintLn(try_catch.Exception());
1812 return; 1825 return;
1813 } 1826 }
1814 1827
1815 // Notify the debugger that a debug event has occurred unless auto continue is
1816 // active in which case no event is send.
1817 if (!auto_continue) {
1818 bool success = InvokeMessageHandlerWithEvent(event_data);
1819 if (!success) {
1820 // If failed to notify debugger just continue running.
1821 return;
1822 }
1823 }
1824
1825 // Process requests from the debugger. 1828 // Process requests from the debugger.
1826 while (true) { 1829 while (true) {
1827 // Wait for new command in the queue. 1830 // Wait for new command in the queue.
1828 if (Debugger::host_dispatch_handler_) { 1831 if (Debugger::host_dispatch_handler_) {
1829 // In case there is a host dispatch - do periodic dispatches. 1832 // In case there is a host dispatch - do periodic dispatches.
1830 if (!command_received_->Wait(host_dispatch_micros_)) { 1833 if (!command_received_->Wait(host_dispatch_micros_)) {
1831 // Timout expired, do the dispatch. 1834 // Timout expired, do the dispatch.
1832 Debugger::host_dispatch_handler_(); 1835 Debugger::host_dispatch_handler_();
1833 continue; 1836 continue;
1834 } 1837 }
1835 } else { 1838 } else {
1836 // In case there is no host dispatch - just wait. 1839 // In case there is no host dispatch - just wait.
1837 command_received_->Wait(); 1840 command_received_->Wait();
1838 } 1841 }
1839 1842
1840 // The debug command interrupt flag might have been set when the command was
1841 // added.
1842 StackGuard::Continue(DEBUGCOMMAND);
1843
1844 // Get the command from the queue. 1843 // Get the command from the queue.
1845 CommandMessage command = command_queue_.Get(); 1844 CommandMessage command = command_queue_.Get();
1846 Logger::DebugTag("Got request from command queue, in interactive loop."); 1845 Logger::DebugTag("Got request from command queue, in interactive loop.");
1847 if (!Debugger::IsDebuggerActive()) { 1846 if (!Debugger::IsDebuggerActive()) {
1848 // Delete command text and user data. 1847 // Delete command text and user data.
1849 command.Dispose(); 1848 command.Dispose();
1850 return; 1849 return;
1851 } 1850 }
1852 1851
1853 // Invoke JavaScript to process the debug request. 1852 // Invoke JavaScript to process the debug request.
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 2208
2210 2209
2211 void LockingCommandMessageQueue::Clear() { 2210 void LockingCommandMessageQueue::Clear() {
2212 ScopedLock sl(lock_); 2211 ScopedLock sl(lock_);
2213 queue_.Clear(); 2212 queue_.Clear();
2214 } 2213 }
2215 2214
2216 #endif // ENABLE_DEBUGGER_SUPPORT 2215 #endif // ENABLE_DEBUGGER_SUPPORT
2217 2216
2218 } } // namespace v8::internal 2217 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/debug-delay.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698