Issue #10211 has been updated by Kyrylo Silin.


Akira Tanaka wrote:
> Any problem with the return value of trap?

There's no problem with it by itself. However, there are some libraries like RSpec that use `trap`
and not store its return value: https://github.com/rspec/rspec-core/blob/d06ffe85b4513dba296abc653090191806963da0/lib/rspec/core/runner.rb#L150

There's no way to access that proc (unless you monkey-patch the method
it is defined in, but it's crazy :).

----------------------------------------
Feature #10211: Implement Signal.current_trap(sig)
https://bugs.ruby-lang.org/issues/10211#change-48710

* Author: Kyrylo Silin
* Status: Feedback
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
----------------------------------------
Here's pseudocode by ko1:

~~~
def trap2(sig)
  previous_proc = Signal.current_trap(sig)
  Signal.trap(sig){
    previous_proc.call if previous_proc
    yield
  }
end
 
trap2(:INT){...}
~~~

## Motivation

I'm developing a gem that allows using multiple callbacks for a trap: [[https://github.com/kyrylo/multitrap]]
It's pretty simple (and slightly broken). The problem is that if you earlier had defined traps and then
required my library, it would discard your previously defined callbacks.
The library overrides `Signal.trap` and stores callbacks in a hash. However, it stores only new callbacks.
I cannot access previously defined callbacks for signals. They are stored in `GET_VM()->trap_list`, which
isn't exposed neither to Ruby nor to the C extension API. I know when you define a `trap`, it returns a proc.
However, nobody typicaly stores it, so there's no way to access it. So if my gem loads after this assignment,
I'm unable to capture that proc, hence I always overwrite previous "traps". This library might be useful if you
want to define a trap that conflicts with some other gem you depend on, which defines its own trap for the
same signal.

So I need some way to access the callbacks.



-- 
https://bugs.ruby-lang.org/