Feature #19484
openCalling `binding` on a C-level proc raises an `ArgumentError`
Description
Calling binding
on a C-level proc (from &:symbol
) raises an ArgumentError
, "Can't create Binding from C level Proc" but there is no way to tell if a given proc is a C-level proc before calling binding
on it. It’s possible to rescue this error, but rescuing an exception is slow.
Given that a C-level proc doesn't have a binding, would it make more sense to respond to binding
with nil
rather than raise an error? That would allow us to, for example, look up the receiver and fall back to self, e.g. block.binding&.receiver || self
.
Alternatively, it would be useful to be able to check whether a given proc is a C-Level proc using something like this.
case block
when CProc
block.call(self)
else
block.call
end
Updated by joel@drapper.me (Joel Drapper) over 1 year ago
- Description updated (diff)
Updated by Eregon (Benoit Daloze) over 1 year ago
block.binding
is not meant to be fast anyway. So is there a real performance problem caused by that?
nil
would cause the error to happen later and probably be less clear for the user.
Note that "C-level proc" is not a good classification, similar restrictions apply to methods defined in any language but Ruby (e.g. Java for TruffleRuby).