mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
8cb40fcda7
How to reproduce:
class A
def x
yield
ensure
y
end
def y
end
end
# Work
A.new.x do
end
# Not work
# trace:
# [2] /tmp/a.rb:5:in A.x
# [0] /tmp/a.rb:15
# /tmp/a.rb:5: undefined method 'y' for main (NoMethodError)
A.new.x do
break
end
# trace:
# [2] /tmp/a.rb:5:in A.call
# [0] /tmp/a.rb:19
# /tmp/a.rb:5: undefined method 'y' for main (NoMethodError)
lambda do
A.new.x do
return
end
end.call
`self` in ensure is broken when yield and break/return are used.
55 lines
934 B
Ruby
55 lines
934 B
Ruby
##
|
|
# ensure Test
|
|
|
|
assert('ensure - context - yield') do
|
|
class EnsureYieldBreak
|
|
attr_reader :ensure_context
|
|
def try
|
|
yield
|
|
ensure
|
|
@ensure_context = self
|
|
end
|
|
end
|
|
|
|
yielder = EnsureYieldBreak.new
|
|
yielder.try do
|
|
end
|
|
assert_equal yielder, yielder.ensure_context
|
|
end
|
|
|
|
assert('ensure - context - yield and break') do
|
|
class EnsureYieldBreak
|
|
attr_reader :ensure_context
|
|
def try
|
|
yield
|
|
ensure
|
|
@ensure_context = self
|
|
end
|
|
end
|
|
|
|
yielder = EnsureYieldBreak.new
|
|
yielder.try do
|
|
break
|
|
end
|
|
assert_equal yielder, yielder.ensure_context
|
|
end
|
|
|
|
assert('ensure - context - yield and return') do
|
|
class EnsureYieldBreak
|
|
attr_reader :ensure_context
|
|
def try
|
|
yield
|
|
ensure
|
|
@ensure_context = self
|
|
end
|
|
end
|
|
|
|
yielder = EnsureYieldBreak.new
|
|
lambda do
|
|
yielder.try do
|
|
return
|
|
end
|
|
end.call
|
|
assert_equal yielder, yielder.ensure_context
|
|
end
|