From a31d9e31c1a156bf05f0b8cc28ae9cfd1f920ccc Mon Sep 17 00:00:00 2001 From: John Mair Date: Wed, 15 Dec 2010 17:56:06 +1300 Subject: [PATCH] nested pry, seems to create an anonymous object e.g pry (wait for new repl) then pry -- self changes!. Also exit_program seems broken! --- lib/pry.rb | 33 ++++++++++++++++++--------------- lib/pry/input.rb | 2 ++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/pry.rb b/lib/pry.rb index 58530c927..8a0f08d23 100644 --- a/lib/pry.rb +++ b/lib/pry.rb @@ -106,6 +106,8 @@ def re(target=TOPLEVEL_BINDING) target = binding_for(target) Pry.last_result = target.eval r(target) target.eval("_ = Pry.last_result") + rescue SystemExit => e + exit rescue Exception => e e end @@ -153,17 +155,15 @@ def eval_string.clear() replace("") end obj = $~.captures.first target.eval("#{obj}.pry") eval_string.clear - when /^show_method\s*(\w*)/ + when /^show_method\s*(.+)/ meth_name = ($~.captures).first - file, line = target.eval("method(:#{meth_name}).source_location") - tp = Pry.new.tap { |v| v.input = SourceInput.new(file, line) } - output.show_method tp.r + code = get_method_source(target, meth_name, :method) + output.show_method code eval_string.clear - when /^show_instance_method\s*(\w*)/ + when /^show_instance_method\s*(.+)/ meth_name = ($~.captures).first - file, line = target.eval("instance_method(:#{meth_name}).source_location") - tp = Pry.new.tap { |v| v.input = SourceInput.new(file, line) } - output.show_method tp.r + code = get_method_source(target, meth_name, :instance_method) + output.show_method code eval_string.clear when /^jump_to\s*(\d*)/ break_level = ($~.captures).first.to_i @@ -183,6 +183,11 @@ def eval_string.clear() replace("") end end end + def get_method_source(target, meth_name, kind) + file, line = target.eval("#{kind}(:#{meth_name}).source_location") + Pry.new.tap { |v| v.input = SourceInput.new(file, line) }.r + end + def prompt(eval_string, target, nest) target_self = target.eval('self') @@ -198,14 +203,12 @@ def valid_expression?(code) begin test_bed.eval(code) - rescue Exception => e - case e - when SyntaxError - case e.message - when /(parse|syntax) error.*?\$end/i, /unterminated/i - return false - end + rescue SyntaxError => e + case e.message + when /(parse|syntax) error.*?\$end/i, /unterminated/i + return false end + rescue Exception end true end diff --git a/lib/pry/input.rb b/lib/pry/input.rb index e4d471a4d..d355dadad 100644 --- a/lib/pry/input.rb +++ b/lib/pry/input.rb @@ -2,6 +2,8 @@ class Pry class Input + trap('INT') { exit } + def read(prompt) Readline.readline(prompt, true) end