diff options
Diffstat (limited to 'lib/rubygems/core_ext/kernel_warn.rb')
| -rw-r--r--[-rwxr-xr-x] | lib/rubygems/core_ext/kernel_warn.rb | 70 |
1 files changed, 35 insertions, 35 deletions
diff --git a/lib/rubygems/core_ext/kernel_warn.rb b/lib/rubygems/core_ext/kernel_warn.rb index 3e531441ed..f806b77fab 100755..100644 --- a/lib/rubygems/core_ext/kernel_warn.rb +++ b/lib/rubygems/core_ext/kernel_warn.rb @@ -1,45 +1,45 @@ # frozen_string_literal: true -# `uplevel` keyword argument of Kernel#warn is available since ruby 2.5. -if RUBY_VERSION >= "2.5" +module Kernel + rubygems_path = "#{__dir__}/" # Frames to be skipped start with this path. - module Kernel - path = "#{__dir__}/" # Frames to be skipped start with this path. + original_warn = instance_method(:warn) - # Suppress "method redefined" warning - original_warn = instance_method(:warn) - Module.new {define_method(:warn, original_warn)} + remove_method :warn - original_warn = method(:warn) + class << self + remove_method :warn + end - module_function define_method(:warn) {|*messages, uplevel: nil| - unless uplevel - return original_warn.call(*messages) - end + module_function define_method(:warn) {|*messages, **kw| + unless uplevel = kw[:uplevel] + return original_warn.bind_call(self, *messages, **kw) + end + + # Ensure `uplevel` fits a `long` + uplevel, = [uplevel].pack("l!").unpack("l!") + + if uplevel >= 0 + start = 0 + while uplevel >= 0 + loc, = caller_locations(start, 1) + unless loc + # No more backtrace + start += uplevel + break + end - # Ensure `uplevel` fits a `long` - uplevel, = [uplevel].pack("l!").unpack("l!") - - if uplevel >= 0 - start = 0 - while uplevel >= 0 - loc, = caller_locations(start, 1) - unless loc - # No more backtrace - start += uplevel - break - end - - start += 1 - - unless loc.path.start_with?(path) - # Non-rubygems frames - uplevel -= 1 - end + start += 1 + + next unless path = loc.path + unless path.start_with?(rubygems_path, "<internal:") + # Non-rubygems frames + uplevel -= 1 end - uplevel = start end - original_warn.call(*messages, uplevel: uplevel) - } - end + kw[:uplevel] = start + end + + original_warn.bind_call(self, *messages, **kw) + } end |
