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