aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-01-15 21:10:26 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-01-15 21:10:26 +0000
commitc46e390920950f273bdfc1c664f5e672f59e3a21 (patch)
tree3d912a2b9e530762a08260b5dc50be0eecaa39ef /activesupport/lib
parentfb13b7a495c248479f77d42a55e1c3e47c78c49c (diff)
downloadrails-c46e390920950f273bdfc1c664f5e672f59e3a21.tar.gz
rails-c46e390920950f273bdfc1c664f5e672f59e3a21.tar.bz2
rails-c46e390920950f273bdfc1c664f5e672f59e3a21.zip
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
Diffstat (limited to 'activesupport/lib')
-rwxr-xr-xactivesupport/lib/breakpoint.rb59
1 files changed, 24 insertions, 35 deletions
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