module Byebug
# Mix-in module to assist in command parsing.
module EnableDisableFunctions
def enable_disable_breakpoints(is_enable, args)
breakpoints = Byebug.breakpoints.sort_by{|b| b.id }
largest = breakpoints.inject(0) do |tally, b|
tally = b.id if b.id > tally
end
if 0 == largest
errmsg "No breakpoints have been set.\n"
return
end
args.each do |pos|
pos = get_int(pos, "#{is_enable} breakpoints", 1, largest)
return nil unless pos
breakpoints.each do |b|
if b.id == pos
enabled = ("Enable" == is_enable)
if enabled
unless syntax_valid?(b.expr)
errmsg("Expression \"#{b.expr}\" syntactically incorrect; breakpoint remains disabled.\n")
break
end
end
b.enabled = ("Enable" == is_enable)
break
end
end
end
end
def enable_disable_display(is_enable, args)
if 0 == @state.display.size
errmsg "No display expressions have been set.\n"
return
end
args.each do |pos|
pos = get_int(pos, "#{is_enable} display", 1, @state.display.size)
return nil unless pos
@state.display[pos-1][0] = ("Enable" == is_enable)
end
end
end
class EnableCommand < Command
Subcommands =
[
['breakpoints', 2, 'Enable specified breakpoints',
'Give breakpoint numbers (separated by spaces) as arguments. This is ' \
'used to cancel the effect of the \"disable\" command.'],
['display', 2,
'Enable some expressions to be displayed when program stops',
'Arguments are the code numbers of the expressions to resume ' \
'displaying. Do \"info display\" to see the current list of code ' \
'numbers.'],
].map do |name, min, short_help, long_help|
SubcmdStruct.new(name, min, short_help, long_help)
end unless defined?(Subcommands)
def regexp
/^\s* en(?:able)? (?:\s+(.*))?$/ix
end
def execute
if not @match[1]
errmsg "\"enable\" must be followed \"display\", \"breakpoints\"" +
" or breakpoint numbers.\n"
else
args = @match[1].split(/[ \t]+/)
param = args.shift
subcmd = find(Subcommands, param)
if subcmd
send("enable_#{subcmd.name}", args)
else
send("enable_breakpoints", args.unshift(param))
end
end
end
def enable_breakpoints(args)
enable_disable_breakpoints("Enable", args)
end
def enable_display(args)
enable_disable_display("Enable", args)
end
class << self
def help_command
'enable'
end
def help(args)
# specific subcommand help
if args[1]
subcmd = find(Subcommands, args[1])
return "Invalid \"enable\" subcommand \"#{args[1]}\"." unless subcmd
str = subcmd.short_help + '.'
str += "\n" + subcmd.long_help if subcmd.long_help
return str
end
# general help
s = %{
Enable some things.
This is used to cancel the effect of the "disable" command.
--
List of enable subcommands:
--
}
for subcmd in Subcommands do
s += "enable #{subcmd.name} -- #{subcmd.short_help}\n"
end
return s
end
end
end
class DisableCommand < Command
Subcommands =
[
['breakpoints', 1, 'Disable some breakpoints',
'Arguments are breakpoint numbers with spaces in between. A disabled ' \
'breakpoint is not forgotten, but has no effect until reenabled.'],
['display', 1, 'Disable some display expressions when program stops',
'Arguments are the code numbers of the expressions to stop ' \
'displaying. Do \"info display\" to see the current list of code ' \
'numbers.'],
].map do |name, min, short_help, long_help|
SubcmdStruct.new(name, min, short_help, long_help)
end unless defined?(Subcommands)
def regexp
/^\s* dis(?:able)? (?:\s+(.*))?$/ix
end
def execute
if not @match[1]
errmsg "\"disable\" must be followed \"display\", \"breakpoints\"" +
" or breakpoint numbers.\n"
else
args = @match[1].split(/[ \t]+/)
param = args.shift
subcmd = find(Subcommands, param)
if subcmd
send("disable_#{subcmd.name}", args)
else
send("disable_breakpoints", args.unshift(param))
end
end
end
def disable_breakpoints(args)
enable_disable_breakpoints("Disable", args)
end
def disable_display(args)
enable_disable_display("Disable", args)
end
class << self
def help_command
'disable'
end
def help(args)
# specific subcommand help
if args[1]
subcmd = find(Subcommands, args[1])
return "Invalid \"disable\" subcommand \"#{args[1]}\"." unless subcmd
str = subcmd.short_help + '.'
str += "\n" + subcmd.long_help if subcmd.long_help
return str
end
# general help
s = %{
Disable some things.
A disabled item is not forgotten, but has no effect until reenabled.
Use the "enable" command to have it take effect again.
--
List of disable subcommands:
--
}
for subcmd in Subcommands do
s += "disable #{subcmd.name} -- #{subcmd.short_help}\n"
end
return s
end
end
end
end # module Byebug