summaryrefslogtreecommitdiff
path: root/lib/rubygems/core_ext
diff options
context:
space:
mode:
authorhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-31 03:23:30 +0000
committerhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-31 03:23:30 +0000
commit3e047420d69240af98add002e7a3025004094379 (patch)
tree695da063eea6090f531678042512d940b08691bf /lib/rubygems/core_ext
parent6f5eb285077d9abf8f97056531996c58674b570c (diff)
Merge upstream from rubygems/rubygems master branch.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65470 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/core_ext')
-rwxr-xr-xlib/rubygems/core_ext/kernel_warn.rb45
1 files changed, 31 insertions, 14 deletions
diff --git a/lib/rubygems/core_ext/kernel_warn.rb b/lib/rubygems/core_ext/kernel_warn.rb
index 319fdfe606..3e531441ed 100755
--- a/lib/rubygems/core_ext/kernel_warn.rb
+++ b/lib/rubygems/core_ext/kernel_warn.rb
@@ -1,28 +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
- path = "#{__dir__}/"
+ path = "#{__dir__}/" # Frames to be skipped start with this path.
+
+ # Suppress "method redefined" warning
original_warn = instance_method(:warn)
Module.new {define_method(:warn, original_warn)}
+
original_warn = method(:warn)
module_function define_method(:warn) {|*messages, uplevel: nil|
- if uplevel
- uplevel, = [uplevel].pack("l!").unpack("l!")
- if uplevel >= 0
- start = 0
- begin
- loc, = caller_locations(start, 1)
- break start += uplevel unless loc
- start += 1
- end while (loc.path.start_with?(path) or (uplevel -= 1) >= 0)
- uplevel = start
+ unless uplevel
+ return original_warn.call(*messages)
+ 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
end
- original_warn.call(*messages, uplevel: uplevel)
- else
- original_warn.call(*messages)
+ uplevel = start
end
+ original_warn.call(*messages, uplevel: uplevel)
}
end
end