mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
vm.c: break from orphan block
* vm.c (rb_vm_search_cf_from_ep): break from orphan block is possible condition, but not [BUG]. [ruby-core:69548] [Bug #11254] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50850 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
dc0d502b71
commit
3d980e1643
2 changed files with 26 additions and 3 deletions
|
@ -53,7 +53,8 @@ class TestEnumerable < Test::Unit::TestCase
|
|||
|
||||
bug5801 = '[ruby-dev:45041]'
|
||||
@empty.grep(//)
|
||||
assert_nothing_raised(bug5801) {100.times {@empty.block.call}}
|
||||
block = @empty.block
|
||||
assert_nothing_raised(bug5801) {100.times {block.call}}
|
||||
|
||||
a = []
|
||||
lambda = ->(x, i) {a << [x, i]}
|
||||
|
@ -201,6 +202,21 @@ class TestEnumerable < Test::Unit::TestCase
|
|||
assert_equal(1, @obj.first)
|
||||
assert_equal([1, 2, 3], @obj.first(3))
|
||||
assert_nil(@empty.first)
|
||||
|
||||
bug5801 = '[ruby-dev:45041]'
|
||||
assert_in_out_err([], <<-'end;', [], /unexpected break/)
|
||||
empty = Object.new
|
||||
class << empty
|
||||
attr_reader :block
|
||||
include Enumerable
|
||||
def each(&block)
|
||||
@block = block
|
||||
self
|
||||
end
|
||||
end
|
||||
empty.first
|
||||
empty.block.call
|
||||
end;
|
||||
end
|
||||
|
||||
def test_sort
|
||||
|
@ -440,7 +456,8 @@ class TestEnumerable < Test::Unit::TestCase
|
|||
|
||||
bug5801 = '[ruby-dev:45040]'
|
||||
@empty.take_while {true}
|
||||
assert_nothing_raised(bug5801) {100.times {@empty.block.call}}
|
||||
block = @empty.block
|
||||
assert_nothing_raised(bug5801) {100.times {block.call}}
|
||||
end
|
||||
|
||||
def test_drop
|
||||
|
|
8
vm.c
8
vm.c
|
@ -44,7 +44,7 @@ rb_vm_search_cf_from_ep(const rb_thread_t * const th, rb_control_frame_t *cfp, c
|
|||
cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
||||
}
|
||||
|
||||
rb_bug("rb_vm_search_cf_from_ep: no corresponding cfp");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1201,6 +1201,12 @@ vm_iter_break(rb_thread_t *th, VALUE val)
|
|||
VALUE *ep = VM_CF_PREV_EP(cfp);
|
||||
rb_control_frame_t *target_cfp = rb_vm_search_cf_from_ep(th, cfp, ep);
|
||||
|
||||
#if 0 /* raise LocalJumpError */
|
||||
if (!target_cfp) {
|
||||
rb_vm_localjump_error("unexpected break", val, TAG_BREAK);
|
||||
}
|
||||
#endif
|
||||
|
||||
th->state = TAG_BREAK;
|
||||
th->errinfo = (VALUE)THROW_DATA_NEW(val, target_cfp, TAG_BREAK);
|
||||
TH_JUMP_TAG(th, TAG_BREAK);
|
||||
|
|
Loading…
Add table
Reference in a new issue