1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

forwardable.rb: backtrace

* lib/forwardable.rb (_delegator_method): leave the backtrace
  untouched during accessor.  forwardable.rb does not appear in
  the backtrace during delegated method because of tail-call
  optimization.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55372 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-06-11 00:31:30 +00:00
parent 8a8d3e2ed4
commit e8700ab03d
3 changed files with 16 additions and 11 deletions

View file

@ -1,3 +1,10 @@
Sat Jun 11 09:31:28 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/forwardable.rb (_delegator_method): leave the backtrace
untouched during accessor. forwardable.rb does not appear in
the backtrace during delegated method because of tail-call
optimization.
Sat Jun 11 01:38:31 2016 Naohisa Goto <ngotogenome@gmail.com> Sat Jun 11 01:38:31 2016 Naohisa Goto <ngotogenome@gmail.com>
* include/ruby/defines.h (GCC_VERSION_SINCE): Fix logic error by * include/ruby/defines.h (GCC_VERSION_SINCE): Fix logic error by

View file

@ -113,12 +113,9 @@ module Forwardable
# Version of +forwardable.rb+ # Version of +forwardable.rb+
FORWARDABLE_VERSION = "1.1.0" FORWARDABLE_VERSION = "1.1.0"
FILE_REGEXP = %r"#{Regexp.quote(__FILE__)}"
@debug = nil @debug = nil
class << self class << self
# If true, <tt>__FILE__</tt> will remain in the backtrace in the event an # ignored
# Exception is raised.
attr_accessor :debug attr_accessor :debug
end end
@ -204,8 +201,6 @@ module Forwardable
def #{ali}(*args, &block) def #{ali}(*args, &block)
begin begin
#{accessor} #{accessor}
ensure
$@.delete_if {|s| ::Forwardable::FILE_REGEXP =~ s} if $@ and !::Forwardable::debug
end.__send__ :#{method}, *args, &block end.__send__ :#{method}, *args, &block
end end
end end

View file

@ -225,18 +225,21 @@ class TestForwardable < Test::Unit::TestCase
class Foo class Foo
extend Forwardable extend Forwardable
attr_accessor :bar
def_delegator :bar, :baz def_delegator :bar, :baz
def_delegator :caller, :itself, :c def_delegator :caller, :itself, :c
class Exception
end
end end
def test_backtrace_adjustment def test_backtrace_adjustment
obj = Foo.new
def (obj.bar = Object.new).baz
foo
end
e = assert_raise(NameError) { e = assert_raise(NameError) {
Foo.new.baz obj.baz
} }
assert_not_match(/\/forwardable\.rb/, e.backtrace[0]) assert_not_match(/\/forwardable\.rb/, e.backtrace[0],
proc {RubyVM::InstructionSequence.of(obj.method(:baz)).disassemble})
assert_equal(caller(0, 1)[0], Foo.new.c[0]) assert_equal(caller(0, 1)[0], Foo.new.c[0])
end end