Project

General

Profile

Actions

Feature #19484

open

Calling `binding` on a C-level proc raises an `ArgumentError`

Added by joel@drapper.me (Joel Drapper) over 1 year ago. Updated over 1 year ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:112741]

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
Actions

Also available in: Atom PDF

Like0
Like0Like1