# class Byebug::CommandProcessor

Processes commands in regular mode.

You can override this class to create your own command processor that, for example, whitelists only certain commands to be executed.

@see PostMortemProcessor for a example

### Attributes

context[R]
interface[R]
prev_line[RW]

### Public Class Methods

new(context, interface = LocalInterface.new) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 23
    def initialize(context, interface = LocalInterface.new)
      @context = context
      @interface = interface

      @proceed = false
      @prev_line = nil
    end

### Public Instance Methods

at_breakpoint(brkpt) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 64
    def at_breakpoint(brkpt)
      number = Byebug.breakpoints.index(brkpt) + 1

      puts "Stopped by breakpoint #{number} at #{frame.file}:#{frame.line}"
    end

at_catchpoint(exception) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 70
    def at_catchpoint(exception)
      puts "Catchpoint at #{context.location}: `#{exception}'"
    end

at_end() click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 80
    def at_end
      process_commands
    end

at_line() click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 54
    def at_line
      process_commands
    end

at_return(return_value) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 74
    def at_return(return_value)
      puts "Return value is: #{safe_inspect(return_value)}"

      process_commands
    end

at_tracing() click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 58
    def at_tracing
      puts "Tracing: #{context.full_location}"

      run_auto_cmds(2)
    end

command_list() click to toggle source

Available commands

    # File lib/byebug/processors/command_processor.rb, line 50
    def command_list
      @command_list ||= CommandList.new(commands)
    end

printer() click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 31
    def printer
      @printer ||= Printers::Plain.new
    end

proceed!() click to toggle source

Let the execution continue

    # File lib/byebug/processors/command_processor.rb, line 87
    def proceed!
      @proceed = true
    end

process_commands() click to toggle source

Handle byebug commands.

    # File lib/byebug/processors/command_processor.rb, line 94
    def process_commands
      before_repl

      repl
    ensure
      after_repl
    end

### Protected Instance Methods

after_repl() click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 119
    def after_repl
      interface.autosave
    end

before_repl() click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 111
    def before_repl
      @proceed = false
      @prev_line = nil

      run_auto_cmds(1)
      interface.autorestore
    end

prompt() click to toggle source

Prompt shown before reading a command.

    # File lib/byebug/processors/command_processor.rb, line 107
    def prompt
      "(byebug) "
    end

repl() click to toggle source

Main byebug's REPL

    # File lib/byebug/processors/command_processor.rb, line 126
    def repl
      until @proceed
        cmd = interface.read_command(prompt)
        return if cmd.nil?

        next if cmd == ""

        run_cmd(cmd)
      end
    end

### Private Instance Methods

auto_cmds_for(run_level) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 139
    def auto_cmds_for(run_level)
      command_list.select { |cmd| cmd.always_run >= run_level }
    end

run_auto_cmds(run_level) click to toggle source

Run permanent commands.

    # File lib/byebug/processors/command_processor.rb, line 146
    def run_auto_cmds(run_level)
      safely do
        auto_cmds_for(run_level).each { |cmd| cmd.new(self).execute }
      end
    end

run_cmd(input) click to toggle source

Executes the received input

Instantiates a command matching the input and runs it. If a matching command is not found, it evaluates the unknown input.

    # File lib/byebug/processors/command_processor.rb, line 158
    def run_cmd(input)
      safely do
        command = command_list.match(input)
        return command.new(self, input).execute if command

        puts safe_inspect(multiple_thread_eval(input))
      end
    end

safely() { || ... } click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 167
    def safely
      yield
    rescue StandardError => e
      errmsg(e.message)
    end