1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
# frozen_string_literal: true
require_relative "../command"
module Byebug
#
# Show (and possibly stop) at every line that changes a global variable.
#
class TracevarCommand < Command
def self.regexp
/^\s* tr(?:acevar)? (?: \s+ (\S+))? # (variable-name)?
(?: \s+ (stop|nostop))?
\s*$/x
end
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.short_description
"Enables tracing of a global variable"
end
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
private
def on_change(name, value, stop)
puts pr("trace.messages.on_change", name: name, value: value)
context.step_out(1, false) if stop
end
end
end
|