class Byebug::TracevarCommand


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

def self.description

def self.description
  <<-DESCRIPTION
    tr[acevar] <variable> [[no]stop]
    #{short_description}
    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.
  DESCRIPTION
end

def self.regexp

def self.regexp
  /^\s* tr(?:acevar)? (?: \s+ (\S+))?  # (variable-name)?
                      (?: \s+ (stop|nostop))?
   \s*$/x
end

def self.short_description

def self.short_description
  "Enables tracing of a global variable"
end

def execute

def execute
  var = @match[1]
  return errmsg(pr("trace.errors.needs_global_variable")) unless var
  return errmsg(pr("trace.errors.var_is_not_global", name: var)) unless global_variables.include?(:"#{var}")
  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

def on_change(name, value, stop)

def on_change(name, value, stop)
  puts pr("trace.messages.on_change", name: name, value: value)
  context.step_out(1, false) if stop
end