From: "Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>
Date: 2023-03-08T18:49:10+00:00
Subject: [ruby-core:112745] [Ruby master Feature#19484] Calling `binding` on a C-level proc raises an `ArgumentError`

Issue #19484 has been updated by Eregon (Benoit Daloze).





`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).



----------------------------------------

Feature #19484: Calling `binding` on a C-level proc raises an `ArgumentError`

https://bugs.ruby-lang.org/issues/19484#change-102237



* Author: joel@drapper.me (Joel Drapper)

* Status: Open

* Priority: Normal

----------------------------------------

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.



```ruby

case block

when CProc

  block.call(self)

else

  block.call

end

```







-- 

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

 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/