# class Byebug::CommandProcessor

Processes commands in regular mode

### Attributes

display[R]
state[R]

### Public Class Methods

new(interface = LocalInterface.new) click to toggle source
Calls superclass method Byebug::Processor.new

    # File lib/byebug/processors/command_processor.rb, line 10
    def initialize(interface = LocalInterface.new)
      super(interface)

      @display = []
      @last_cmd = nil # To allow empty (just <RET>) commands
      @context_was_dead = false # Assume we haven't started.
    end

### Public Instance Methods

at_breakpoint(_context, breakpoint) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 25
    def at_breakpoint(_context, breakpoint)
      n = Byebug.breakpoints.index(breakpoint) + 1
      file = normalize(breakpoint.source)
      line = breakpoint.pos

      puts "Stopped by breakpoint #{n} at #{file}:#{line}"
    end

at_catchpoint(context, excpt) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 33
    def at_catchpoint(context, excpt)
      file = normalize(context.frame_file(0))
      line = context.frame_line(0)

      puts "Catchpoint at #{file}:#{line}: `#{excpt}' (#{excpt.class})"
    end

at_line(context, file, line) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 46
    def at_line(context, file, line)
      process_commands(context, file, line)
    end

at_return(context, file, line) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 50
    def at_return(context, file, line)
      process_commands(context, file, line)
    end

at_tracing(context, file, line) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 40
    def at_tracing(context, file, line)
      puts "Tracing: #{normalize(file)}:#{line} #{get_line(file, line)}"

      always_run(context, file, line, 2)
    end

interface=(interface) click to toggle source

    # File lib/byebug/processors/command_processor.rb, line 18
    def interface=(interface)
      @interface.close if @interface
      @interface = interface
    end

### Private Instance Methods

always_run(context, file, line, run_level) click to toggle source

Run commands everytime.

For example display commands or possibly the list or irb in an “autolist” or “autoirb”.

@return List of commands acceptable to run bound to the current state

    # File lib/byebug/processors/command_processor.rb, line 71
    def always_run(context, file, line, run_level)
      @state = RegularState.new(context, @display, file, @interface, line)

      # Change default when in irb or code included in command line
      Setting[:autolist] = false if ['(irb)', '-e'].include?(file)

      # Bind commands to the current state.
      Command.commands.each do |cmd|
        cmd.new(state).execute if cmd.always_run >= run_level
      end
    end

match_cmd(input) click to toggle source

Finds a matches the command matching the input

    # File lib/byebug/processors/command_processor.rb, line 147
    def match_cmd(input)
      Command.commands.each do |c|
        cmd = c.new(state)
        return cmd if cmd.match(input)
      end

      nil
    end

one_cmd(context, input) click to toggle source

Executes a single byebug command

    # File lib/byebug/processors/command_processor.rb, line 132
    def one_cmd(context, input)
      cmd = match_cmd(input)

      return one_unknown_cmd(input) unless cmd

      if context.dead? && !cmd.class.allow_in_post_mortem
        return errmsg('Command unavailable in post mortem mode.')
      end

      cmd.execute
    end

one_unknown_cmd(input) click to toggle source

Autoevals a single command

    # File lib/byebug/processors/command_processor.rb, line 118
    def one_unknown_cmd(input)
      unless Setting[:autoeval]
        return errmsg("Unknown command: \"#{input}\". Try \"help\"")
      end

      eval_cmd = EvalCommand.new(state)
      eval_cmd.match(input)
      eval_cmd.execute
    end

process_commands(context, file, line) click to toggle source

Handle byebug commands.

    # File lib/byebug/processors/command_processor.rb, line 86
    def process_commands(context, file, line)
      always_run(context, file, line, 1)

      puts 'The program finished.' if program_just_finished?(context)
      puts(state.location) if Setting[:autolist] == 0

      @interface.autorestore

      repl(context)
    ensure
      @interface.autosave
    end

program_just_finished?(context) click to toggle source

Returns true first time control is given to the user after program termination.

    # File lib/byebug/processors/command_processor.rb, line 160
    def program_just_finished?(context)
      result = context.dead? && !@context_was_dead
      @context_was_dead = false if result == true
      result
    end

prompt(context) click to toggle source

Prompt shown before reading a command.

    # File lib/byebug/processors/command_processor.rb, line 59
    def prompt(context)
      "(byebug#{context.dead? ? ':post-mortem' : ''}) "
    end

repl(context) click to toggle source

Main byebug's REPL

    # File lib/byebug/processors/command_processor.rb, line 102
    def repl(context)
      until state.proceed?
        cmd = @interface.read_command(prompt(context))
        return unless cmd

        next if cmd == '' && @last_cmd.nil?

        cmd.empty? ? cmd = @last_cmd : @last_cmd = cmd

        one_cmd(context, cmd)
      end
    end