# class Byebug::TracevarCommand

Show (and possibily stop) at every line that changes a global variable.

### Public Class Methods

description() click to toggle source

    # File lib/byebug/commands/tracevar.rb, line 44
    def description
      prettify <<-EOD
        tr[acevar] <variable> [[no]stop]

        Start tracing variable <variable>.

        If "stop" is specified, execution will stop every time the variable
        changes its value. If nothing or "nostop" is specified, execution
        won't stop, changes will just be logged in byebug's output.
      EOD
    end

names() click to toggle source

    # File lib/byebug/commands/tracevar.rb, line 40
    def names
      %w(tracevar)
    end

### Public Instance Methods

execute() click to toggle source

    # File lib/byebug/commands/tracevar.rb, line 16
    def execute
      var = @match[1]
      return errmsg(pr('trace.errors.needs_global_variable')) unless var

      unless global_variables.include?(:"#{var}")
        return errmsg(pr('trace.errors.var_is_not_global', name: var))
      end

      stop = @match[2] && @match[2] !~ /nostop/

      instance_eval do
        trace_var(:"#{var}") { |val| on_change(var, val, stop) }
      end

      puts pr('trace.messages.success', var: var)
    end

on_change(name, value, stop) click to toggle source

    # File lib/byebug/commands/tracevar.rb, line 33
    def on_change(name, value, stop)
      puts pr('trace.messages.on_change', name: name, value: value)

      @state.context.step_out(1, false) if stop
    end

regexp() click to toggle source

    # File lib/byebug/commands/tracevar.rb, line 10
    def regexp
      /^\s* tr(?:acevar)? (?: \s+ (\S+))?  # (variable-name)?
                          (?: \s+ (stop|nostop))?
       \s*$/x
    end