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 by \"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
def 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
EnableCommand.description + format_subcmds(Subcommands)
end
class << self
def names
%w(enable)
end
def description
%{
Enable some things.
This is used to cancel the effect of the "disable" command.
}
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 by \"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
def help(args)
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
DisableCommand.description + format_subcmds(Subcommads)
end
class << self
def names
%w(disable)
end
def description
%{
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.
}
end
end
end
end