Skip to content

Commit

Permalink
Renamed instance_exec to instance_eval_with_args.
Browse files Browse the repository at this point in the history
We don't want to expose instance_exec as a public API; it's just for RSpec's internal use.  I also added some guard conditionals to the implementation so that we only use the 1.8.6 instance_exec hack if it's really necessary.
  • Loading branch information
myronmarston authored and dchelimsky committed Aug 5, 2010
1 parent b236a8d commit 82e5733
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 33 deletions.
2 changes: 1 addition & 1 deletion lib/rspec/core.rb
@@ -1,5 +1,5 @@
require 'rspec/core/kernel_extensions'
require 'rspec/core/instance_exec'
require 'rspec/core/instance_eval_with_args'
require 'rspec/core/object_extensions'
require 'rspec/core/load_path'
require 'rspec/core/deprecation'
Expand Down
4 changes: 2 additions & 2 deletions lib/rspec/core/example_group.rb
Expand Up @@ -2,7 +2,7 @@ module RSpec
module Core
class ExampleGroup
extend Hooks
include InstanceExec
include InstanceEvalWithArgs
include Subject
include Let
include Pending
Expand Down Expand Up @@ -192,7 +192,7 @@ def self.eval_before_alls(example_group_instance)
def self.eval_around_eachs(example_group_instance, wrapped_example)
around_hooks.reverse.inject(wrapped_example) do |wrapper, hook|
def wrapper.run; call; end
lambda { example_group_instance.instance_exec(wrapper, &hook) }
lambda { example_group_instance.instance_eval_with_args(wrapper, &hook) }
end
end

Expand Down
38 changes: 38 additions & 0 deletions lib/rspec/core/instance_eval_with_args.rb
@@ -0,0 +1,38 @@
module RSpec
module Core
module InstanceEvalWithArgs
# based on Bounded Spec InstanceExec (Mauricio Fernandez)
# http://eigenclass.org/hiki/bounded+space+instance_exec
# - uses singleton_class instead of global InstanceExecHelper module
# - this keeps it scoped to classes/modules that include this module
# - only necessary for ruby 1.8.6
def instance_eval_with_args(*args, &block)
return instance_exec(*args, &block) if respond_to?(:instance_exec)

# If there are no args and the block doesn't expect any, there's no
# need to fake instance_exec with our hack below.
# Notes:
# * lambda { }.arity # => -1
# * lambda { || }.arity # => 0
# * lambda { |*a| }.arity # -1
return instance_eval(&block) if block.arity < 1 && args.size.zero?

singleton_class = (class << self; self; end)
begin
orig_critical, Thread.critical = Thread.critical, true
n = 0
n += 1 while respond_to?(method_name="__instance_exec#{n}")
singleton_class.module_eval{ define_method(method_name, &block) }
ensure
Thread.critical = orig_critical
end
begin
return send(method_name, *args)
ensure
singleton_class.module_eval{ remove_method(method_name) } rescue nil
end
end
end
end
end

30 changes: 0 additions & 30 deletions lib/rspec/core/instance_exec.rb

This file was deleted.

0 comments on commit 82e5733

Please sign in to comment.