From c46e390920950f273bdfc1c664f5e672f59e3a21 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 15 Jan 2005 21:10:26 +0000 Subject: Fixed some breakpoint issues and made breakpoint_client depend on activerecord/support instead of duplicating the files in railties #441 [Florian Gross] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@424 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activesupport/lib/breakpoint.rb | 59 +++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 35 deletions(-) (limited to 'activesupport/lib') diff --git a/activesupport/lib/breakpoint.rb b/activesupport/lib/breakpoint.rb index 75d55df20e..f753dcc470 100755 --- a/activesupport/lib/breakpoint.rb +++ b/activesupport/lib/breakpoint.rb @@ -21,6 +21,9 @@ require 'drb' require 'drb/acl' module Breakpoint + id = %q$Id$ + Version = id.split(" ")[2].to_i + extend self # This will pop up an interactive ruby session at a @@ -133,15 +136,24 @@ module Breakpoint end # Will execute the specified statement at the client. - def method_missing(method, *args) - if args.empty? - result = eval("#{method}") + def method_missing(method, *args, &block) + if args.empty? and not block + result = eval "#{method}" else result = eval("#{method}(*Marshal.load(#{Marshal.dump(args).inspect}))") - end - - unless [true, false, nil].include?(result) - result.extend(DRbUndumped) if result + # This is a bit ugly. The alternative would be using an + # eval context instead of an eval handler for executing + # the code at the client. The problem with that approach + # is that we would have to handle special expressions + # like "self", "nil" or constants ourself which is hard. + remote = eval %{ + result = lambda { |block, *args| #{method}(*args, &block) } + def result.call_with_block(*args, &block) + call(block, *args) + end + result + } + remote.call_with_block(*args, &block) end return result @@ -175,6 +187,7 @@ module Breakpoint # client.File.open("temp.txt", "w") { |f| f.puts "Hello" } def client() if Breakpoint.use_drb? then + sleep(0.5) until Breakpoint.drb_service.eval_handler Client.new(Breakpoint.drb_service.eval_handler) else Client.new(lambda { |code| eval(code, TOPLEVEL_BINDING) }) @@ -279,7 +292,7 @@ module Breakpoint @collision_handler.call end - def ping; end + def ping() end def add_breakpoint(context, message) workspace = IRB::WorkSpace.new(context) @@ -290,31 +303,7 @@ module Breakpoint @handler.call(workspace, message) end - def register_handler(&block) - @handler = block - end - - def unregister_handler - @handler = nil - end - - attr_reader :eval_handler - - def register_eval_handler(&block) - @eval_handler = block - end - - def unregister_eval_handler - @eval_handler = lambda { } - end - - def register_collision_handler(&block) - @collision_handler = block - end - - def unregister_collision_handler - @collision_handler = lambda { } - end + attr_accessor :handler, :eval_handler, :collision_handler end # Will run Breakpoint in DRb mode. This will spawn a server @@ -507,8 +496,8 @@ end module DRb # :nodoc: class DRbObject#:nodoc: - undef :inspect - undef :clone + undef :inspect if method_defined?(:inspect) + undef :clone if method_defined?(:clone) end end -- cgit v1.2.3