[ruby/irb] Add debug command (https://github.com/ruby/irb/pull/446)
https://github.com/ruby/irb/commit/30faa13fa3
This commit is contained in:
parent
a80b66e7eb
commit
00872d120b
13
lib/irb.rb
13
lib/irb.rb
@ -393,6 +393,8 @@ module IRB
|
|||||||
end
|
end
|
||||||
|
|
||||||
class Irb
|
class Irb
|
||||||
|
DIR_NAME = __dir__
|
||||||
|
|
||||||
ASSIGNMENT_NODE_TYPES = [
|
ASSIGNMENT_NODE_TYPES = [
|
||||||
# Local, instance, global, class, constant, instance, and index assignment:
|
# Local, instance, global, class, constant, instance, and index assignment:
|
||||||
# "foo = bar",
|
# "foo = bar",
|
||||||
@ -434,6 +436,16 @@ module IRB
|
|||||||
@scanner = RubyLex.new
|
@scanner = RubyLex.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def debug_break
|
||||||
|
# it means the debug command is executed
|
||||||
|
if defined?(DEBUGGER__) && DEBUGGER__.respond_to?(:original_capture_frames)
|
||||||
|
# after leaving this initial breakpoint, revert the capture_frames patch
|
||||||
|
DEBUGGER__.singleton_class.send(:alias_method, :capture_frames, :original_capture_frames)
|
||||||
|
# and remove the redundant method
|
||||||
|
DEBUGGER__.singleton_class.send(:undef_method, :original_capture_frames)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def run(conf = IRB.conf)
|
def run(conf = IRB.conf)
|
||||||
conf[:IRB_RC].call(context) if conf[:IRB_RC]
|
conf[:IRB_RC].call(context) if conf[:IRB_RC]
|
||||||
conf[:MAIN_CONTEXT] = context
|
conf[:MAIN_CONTEXT] = context
|
||||||
@ -931,5 +943,6 @@ class Binding
|
|||||||
binding_irb = IRB::Irb.new(workspace)
|
binding_irb = IRB::Irb.new(workspace)
|
||||||
binding_irb.context.irb_path = File.expand_path(source_location[0])
|
binding_irb.context.irb_path = File.expand_path(source_location[0])
|
||||||
binding_irb.run(IRB.conf)
|
binding_irb.run(IRB.conf)
|
||||||
|
binding_irb.debug_break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
33
lib/irb/cmd/debug.rb
Normal file
33
lib/irb/cmd/debug.rb
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
require_relative "nop"
|
||||||
|
|
||||||
|
module IRB
|
||||||
|
# :stopdoc:
|
||||||
|
|
||||||
|
module ExtendCommand
|
||||||
|
class Debug < Nop
|
||||||
|
def execute(*args)
|
||||||
|
require "debug/session"
|
||||||
|
DEBUGGER__.start(nonstop: true)
|
||||||
|
DEBUGGER__.singleton_class.send(:alias_method, :original_capture_frames, :capture_frames)
|
||||||
|
|
||||||
|
def DEBUGGER__.capture_frames(skip_path_prefix)
|
||||||
|
frames = original_capture_frames(skip_path_prefix)
|
||||||
|
frames.reject! do |frame|
|
||||||
|
frame.realpath&.start_with?(::IRB::Irb::DIR_NAME) || frame.path.match?(/internal:prelude/)
|
||||||
|
end
|
||||||
|
frames
|
||||||
|
end
|
||||||
|
|
||||||
|
file, lineno = IRB::Irb.instance_method(:debug_break).source_location
|
||||||
|
DEBUGGER__::SESSION.add_line_breakpoint(file, lineno + 1, oneshot: true, hook_call: false)
|
||||||
|
# exit current Irb#run call
|
||||||
|
throw :IRB_EXIT
|
||||||
|
rescue LoadError => e
|
||||||
|
puts <<~MSG
|
||||||
|
You need to install the debug gem before using this command.
|
||||||
|
If you use `bundle exec`, please add `gem "debug"` into your Gemfile.
|
||||||
|
MSG
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -116,6 +116,10 @@ module IRB # :nodoc:
|
|||||||
[:kill, OVERRIDE_PRIVATE_ONLY],
|
[:kill, OVERRIDE_PRIVATE_ONLY],
|
||||||
],
|
],
|
||||||
|
|
||||||
|
[
|
||||||
|
:irb_debug, :Debug, "cmd/debug",
|
||||||
|
[:debug, NO_OVERRIDE],
|
||||||
|
],
|
||||||
[
|
[
|
||||||
:irb_help, :Help, "cmd/help",
|
:irb_help, :Help, "cmd/help",
|
||||||
[:help, NO_OVERRIDE],
|
[:help, NO_OVERRIDE],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user