diff options
author | Marcelo Pereira <[email protected]> | 2022-07-29 15:09:54 +0200 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2023-07-15 15:24:43 +0900 |
commit | f15123c34ce80f3928612befe2a9aaf4c9d27fda (patch) | |
tree | db2cb9f714fdf997585334c370dd3c570ff71b80 /enumerator.c | |
parent | 82cd70ef935e6aac8cc929af24fb21c2157524f7 (diff) |
Fix stack trace for rescued StopIteration
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6201
Diffstat (limited to 'enumerator.c')
-rw-r--r-- | enumerator.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/enumerator.c b/enumerator.c index 1058e331bb..252333f303 100644 --- a/enumerator.c +++ b/enumerator.c @@ -165,7 +165,10 @@ static VALUE sym_each, sym_cycle, sym_yield; static VALUE lazy_use_super_method; +extern ID ruby_static_id_cause; + #define id_call idCall +#define id_cause ruby_static_id_cause #define id_each idEach #define id_eqq idEqq #define id_initialize idInitialize @@ -787,8 +790,16 @@ get_next_values(VALUE obj, struct enumerator *e) { VALUE curr, vs; - if (e->stop_exc) - rb_exc_raise(e->stop_exc); + if (e->stop_exc) { + VALUE exc = e->stop_exc; + VALUE result = rb_attr_get(exc, id_result); + VALUE mesg = rb_attr_get(exc, idMesg); + if (!NIL_P(mesg)) mesg = rb_str_dup(mesg); + VALUE stop_exc = rb_exc_new_str(rb_eStopIteration, mesg); + rb_ivar_set(stop_exc, id_cause, exc); + rb_ivar_set(stop_exc, id_result, result); + rb_exc_raise(stop_exc); + } curr = rb_fiber_current(); |