summaryrefslogtreecommitdiff
path: root/enumerator.c
diff options
context:
space:
mode:
authorMarcelo Pereira <marcelovitor.pereira@gmail.com>2022-07-29 15:09:54 +0200
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-15 15:24:43 +0900
commitf15123c34ce80f3928612befe2a9aaf4c9d27fda (patch)
treedb2cb9f714fdf997585334c370dd3c570ff71b80 /enumerator.c
parent82cd70ef935e6aac8cc929af24fb21c2157524f7 (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.c15
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();