From 155f64e3c4ba23f0e85e8d69facceb21a487dccd Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 15 Apr 2020 01:25:04 +0900 Subject: Raise EPIPE at broken pipe for the backward compatibility Instead of SignalException for SIGPIPE, raise `Errno::EPIPE` with instance variable `signo` and re-send that signal at exit. [Feature #14413] --- eval.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 0102171205..dc71073fec 100644 --- a/eval.c +++ b/eval.c @@ -243,6 +243,7 @@ rb_ec_cleanup(rb_execution_context_t *ec, volatile int ex) state = 0; for (nerr = 0; nerr < numberof(errs); ++nerr) { VALUE err = ATOMIC_VALUE_EXCHANGE(errs[nerr], Qnil); + VALUE sig; if (!RTEST(err)) continue; @@ -258,6 +259,11 @@ rb_ec_cleanup(rb_execution_context_t *ec, volatile int ex) state = NUM2INT(sig); break; } + else if (rb_obj_is_kind_of(err, rb_eSystemCallError) && + FIXNUM_P(sig = rb_attr_get(err, id_signo))) { + state = NUM2INT(sig); + break; + } else if (sysex == EXIT_SUCCESS) { sysex = EXIT_FAILURE; } -- cgit v1.2.3