/vendor/bundle/jruby/2.1/gems/rspec-core-2.14.8/lib/rspec/core/extensions/instance_eval_with_args.rb
https://github.com/delowong/logstash · Ruby · 44 lines · 26 code · 2 blank · 16 comment · 4 complexity · d9f8de682dfcb43e2b5345877f111046 MD5 · raw file
- module RSpec
- module Core
- module Extensions
- # @private
- module InstanceEvalWithArgs
- # @private
- #
- # Used internally to support `instance_exec` in Ruby 1.8.6.
- #
- # 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
- end