summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-02-09 00:42:12 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-02-09 12:59:06 +0900
commit97cf290063ab940d08819cd96cbcca0ef6d50e4c (patch)
tree4b45739ea80690fddc9a94e13764b06d4ffcfc00
parenta6f5f3cccda381ae332aaa6467f2644611371fb5 (diff)
Copy va_list of exception classes
The list is reused when an exception raised again after retrying in the rescue procedure.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4159
-rw-r--r--eval.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/eval.c b/eval.c
index 2c9e375e25..55d66b5508 100644
--- a/eval.c
+++ b/eval.c
@@ -1033,14 +1033,18 @@ rb_vrescue2(VALUE (* b_proc) (VALUE), VALUE data1,
if (state == TAG_RAISE) {
int handle = FALSE;
VALUE eclass;
+ va_list ap;
result = Qnil;
- while ((eclass = va_arg(args, VALUE)) != 0) {
+ /* reuses args when raised again after retrying in r_proc */
+ va_copy(ap, args);
+ while ((eclass = va_arg(ap, VALUE)) != 0) {
if (rb_obj_is_kind_of(ec->errinfo, eclass)) {
handle = TRUE;
break;
}
}
+ va_end(ap);
if (handle) {
state = TAG_NONE;