class Byebug::Command
def allow_in_post_mortem
def allow_in_post_mortem @allow_in_post_mortem ||= !defined?(@allow_in_post_mortem) ? true : false end
def always_run
def always_run @always_run ||= 0 end
def bb_eval(str, b = get_binding)
def bb_eval(str, b = get_binding) begin eval(str, b) rescue StandardError, ScriptError => e at = eval('Thread.current.backtrace_locations(1)', b) print "#{at.shift}: #{e.class} Exception(#{e.message})\n" for i in at print "\tfrom #{i}\n" end nil end end
def bb_warning_eval(str, b = get_binding)
def bb_warning_eval(str, b = get_binding) begin eval(str, b) rescue StandardError, ScriptError => e print "#{e.class} Exception: #{e.message}\n" nil end end
def command_exists?(command)
def command_exists?(command) ENV['PATH'].split(File::PATH_SEPARATOR).any? { |d| File.exist? File.join(d, command) } end
def commands
def commands @commands ||= [] end
def confirm(msg)
def confirm(msg) @state.confirm(msg) == 'y' end
def find(subcmds, param)
def find(subcmds, param) param.downcase! for try_subcmd in subcmds do if (param.size >= try_subcmd.min) and (try_subcmd.name[0..param.size-1] == param) return try_subcmd end end return nil end
def format_subcmd(subcmd_name)
def format_subcmd(subcmd_name) subcmd = find(self::Subcommands, subcmd_name) return "Invalid \"#{names.join("|")}\" " \ "subcommand \"#{args[1]}\"." unless subcmd return "#{subcmd.help}.\n" end
def format_subcmds
def format_subcmds cmd_name = names.join("|") s = "\n" \ "--\n" \ "List of \"#{cmd_name}\" subcommands:\n" \ "--\n" w = self::Subcommands.map(&:name).max_by(&:size).size for subcmd in self::Subcommands do s += sprintf "%s %-#{w}s -- %s\n", cmd_name, subcmd.name, subcmd.help end return s end
def get_binding pos = @state.frame_pos
def get_binding pos = @state.frame_pos @state.context ? @state.context.frame_binding(pos) : TOPLEVEL_BINDING end
def get_context(thnum)
def get_context(thnum) Byebug.contexts.find {|c| c.thnum == thnum} end
def help(args)
def help(args) if args && args[1] output = format_subcmd(args[1]) else output = description.gsub(/^ +/, '') + "\n" output += format_subcmds if defined? self::Subcommands end output end
def inherited(klass)
def inherited(klass) commands << klass end
def initialize(state)
def initialize(state) @match, @state = nil, state end
def load_commands
def load_commands Dir[File.join(File.dirname(__FILE__), 'commands', '*')].each { |file| require file } Byebug.constants.grep(/Functions$/).map { |name| Byebug.const_get(name) }.each { |mod| include mod } end
def match(input)
def match(input) @match = regexp.match(input) end
def register_setting_get(name, &block)
def register_setting_get(name, &block) settings_map[name] ||= {} settings_map[name][:getter] = block end
def register_setting_set(name, &block)
def register_setting_set(name, &block) settings_map[name] ||= {} settings_map[name][:setter] = block end
def register_setting_var(name, default)
def register_setting_var(name, default) var_name = "@@#{name}" class_variable_set(var_name, default) register_setting_get(name) { class_variable_get(var_name) } register_setting_set(name) { |value| class_variable_set(var_name, value) } end
def settings
def settings unless defined? @settings and @settings @settings = Object.new map = settings_map c = class << @settings; self end c.send(:define_method, :[]) do |name| raise "No such setting #{name}" unless map.has_key?(name) map[name][:getter].call end c.send(:define_method, :[]=) do |name, value| raise "No such setting #{name}" unless map.has_key?(name) map[name][:setter].call(value) end end @settings end
def settings_map
def settings_map @@settings_map ||= {} end
def terminal_width
def terminal_width if ENV['COLUMNS'] =~ /^\d+$/ ENV['COLUMNS'].to_i elsif STDIN.tty? && command_exists?('stty') `stty size`.scan(/\d+/)[1].to_i else nil end end