Feature #11498 ยป loop-result.patch
| ChangeLog | ||
|---|---|---|
|
Tue Sep 1 14:49:27 2015 Akinori MUSHA <knu@iDaemons.org>
|
||
|
* vm_eval.c (rb_f_loop): When a loop is stopped by a StopIteration
|
||
|
exception, return what the enumerator has returned instead of
|
||
|
nil.
|
||
|
Mon Aug 31 17:04:45 2015 Koichi Sasada <ko1@atdot.net>
|
||
|
* class.c (move_refined_method): should insert a write barrier
|
||
| NEWS | ||
|---|---|---|
|
this parameter is bitwise-ORed to oflags generated by normal mode argument.
|
||
|
[Feature #11253]
|
||
|
* Kernel
|
||
|
* Kernel#loop, when stopped by a StopIteration exception, returns
|
||
|
what the enumerator has returned instead of nil.
|
||
|
* Module
|
||
|
* Module#deprecate_constant [Feature #11398]
|
||
| test/ruby/test_enumerator.rb | ||
|---|---|---|
|
}
|
||
|
end
|
||
|
def test_loop_return_value
|
||
|
assert_equal nil, loop { break }
|
||
|
assert_equal 42, loop { break 42 }
|
||
|
e = Enumerator.new { |y| y << 1; y << 2; :stopped }
|
||
|
assert_equal :stopped, loop { e.next while true }
|
||
|
end
|
||
|
def test_nested_iteration
|
||
|
def (o = Object.new).each
|
||
|
yield :ok1
|
||
| vm_eval.c | ||
|---|---|---|
|
static int vm_collect_local_variables_in_heap(rb_thread_t *th, const VALUE *dfp, const struct local_var_list *vars);
|
||
|
static VALUE rb_eUncaughtThrow;
|
||
|
static ID id_tag, id_value;
|
||
|
static ID id_result, id_tag, id_value;
|
||
|
#define id_mesg idMesg
|
||
|
/* vm_backtrace.c */
|
||
| ... | ... | |
|
}
|
||
|
static VALUE
|
||
|
loop_stop(VALUE dummy, VALUE exc)
|
||
|
{
|
||
|
return rb_attr_get(exc, id_result);
|
||
|
}
|
||
|
static VALUE
|
||
|
rb_f_loop_size(VALUE self, VALUE args, VALUE eobj)
|
||
|
{
|
||
|
return DBL2NUM(INFINITY);
|
||
| ... | ... | |
|
rb_f_loop(VALUE self)
|
||
|
{
|
||
|
RETURN_SIZED_ENUMERATOR(self, 0, 0, rb_f_loop_size);
|
||
|
rb_rescue2(loop_i, (VALUE)0, 0, 0, rb_eStopIteration, (VALUE)0);
|
||
|
return Qnil; /* dummy */
|
||
|
return rb_rescue2(loop_i, (VALUE)0, loop_stop, (VALUE)0, rb_eStopIteration, (VALUE)0);
|
||
|
}
|
||
|
#if VMDEBUG
|
||
| ... | ... | |
|
rb_define_method(rb_eUncaughtThrow, "value", uncaught_throw_value, 0);
|
||
|
rb_define_method(rb_eUncaughtThrow, "to_s", uncaught_throw_to_s, 0);
|
||
|
id_result = rb_intern_const("result");
|
||
|
id_tag = rb_intern_const("tag");
|
||
|
id_value = rb_intern_const("value");
|
||
|
}
|
||