<type>documentation</type>
<domain>debug</domain>
<id>flow-control</id>
<title>Flow Control</title>
<date>$Date$</date>
<version>$Revision$</version>
<product>all</product>

Once the debugger is running, the following commands are available to control further
execution of the debug process from Wing.

**Stepping Through Code**

When stopped on a given line of code, execution can be controlled as 
~~~if WEBSITE:
follows from the ``Debug`` menu (some of these are omitted in Wing
Personal and Wing 101)
~~~
~~~if not WEBSITE:
follows from the ``Debug`` menu:
~~~

~~~if WING101:
**Step Over** will step over a single instruction in Python. This may not leave the
current line if it contains something like a list comprehension or single-line for loop.
~~~

~~~if not WING101:
**Step Over Instruction** will step over a single instruction in Python. This may not
leave the current line if it contains something like a list comprehension or single-line
for loop.

**Step Over Statement** will step over the current statement, even if if spans more than
one line or contains a looping construct like a list comprehension.
~~~

~~~if WINGPRO:
**Step Over Block** will step over or finish the current block of code, such as a for
loop, conditional, function, or method.
~~~

**Step Into** will attempt to step into the next executed function on the current line 
of code.  If there is no function
~~~if WING101:
or method to step into, this command acts like ``Step Over``.
~~~
~~~if not WING101:
or method to step into, this command acts like ``Step Over Instruction``. When used on an
import, this will skip Python code executed in ``importlib`` and instead will step
directly into the imported module. This behavior can be disabled with the `Debugger >
Advanced > Step Past importlib Frames
<script:show_preferences_gui#prefname="debug.ignore-import-lib">`__ preference.
~~~

**Step Out** will complete execution of the current function or method and stop on the
first instruction encountered after returning from the current function or method.
  
**Continue** will continue execution until the next breakpoint, exception, or program
termination.

~~~if not WING101:
**Run To Cursor** will run to the location of the cursor in the frontmost editor, or to
the next breakpoint, exception, or program termination.

You can you also step through code using the toolbar icons. The step icon in the toolbar
implements ``Step Over Statement``.
~~~

**Pausing and Terminating Debug**

At any time, a freely running debug process can be paused with the ``Pause`` item in the
``Debug`` menu or with the pause tool bar button. This will stop at the current point of
execution of the debug process, as long as some Python code is being executed.
  
At any time during a debug session, the ``Stop Debugging`` menu item or toolbar item can
be used to force termination of the debug process. This option is disabled if the current
process was launched outside of Wing. It may be enabled for all local processes by using
the `Debugger > Listening > Kill Externally Launched Processes
<script:show_preferences_gui#prefname="debug.enable-kill-external">`__ preference.

~~~if not WING101:
**Move Program Counter**

``Move Program Counter Here`` in the editor's right-click context menu moves the current
position of the execution counter within the innermost stack frame to any other valid
position within the same scope. Stepping or execution will continue with the selected
line.

Because of how Python is implemented, this feature works only in the innermost stack
frame and it does not work when the debugger is stopped on an exception.
~~~
