Project

General

Profile

Bug #10929

NilClass#to_proc and & don't mix?

Added by trans (Thomas Sawyer) over 4 years ago. Updated over 4 years ago.

Status:
Open
Priority:
Normal
Target version:
-
ruby -v:
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
[ruby-core:68384]

Description

This is sort of like a "who would ever care" kind of bug. Nonetheless technically it seems like it is one. So I thought it best that I report it just the same.

  class NilClass
    def to_proc
      Proc.new{ |*x| nil }
    end
  end

  def f(&b)
    b.call(1)
  end  

  f(&nil)
  => NoMethodError: undefined method `call' for nil:NilClass

(Maybe it was fixed already. Filing out this issue reminded me I need to update my version of Ruby.)


Files

block_from_nil.patch (771 Bytes) block_from_nil.patch hanachin (Seiei Miyagi), 03/06/2015 01:00 PM

History

Updated by hanachin (Seiei Miyagi) over 4 years ago

I wrote a patch for this issue.

diff --git bootstraptest/test_block.rb bootstraptest/test_block.rb
index cdc5960..4347fdd 100644
--- bootstraptest/test_block.rb
+++ bootstraptest/test_block.rb
@@ -611,3 +611,17 @@ assert_equal 'ok', %q{
   end
   'ok'
 }
+
+assert_equal 'ok', %q{
+  class NilClass
+    def to_proc
+      Proc.new {|x| x }
+    end
+  end
+
+  def foo(&blk)
+    blk.call('ok')
+  end
+
+  foo(&nil)
+}, '[ruby-core:68384] [Bug #10929]'
diff --git vm_args.c vm_args.c
index cf7256b..e1cb8ac 100644
--- vm_args.c
+++ vm_args.c
@@ -755,7 +755,7 @@ vm_caller_setup_arg_block(const rb_thread_t *th, rb_control_frame_t *reg_cfp, rb

    proc = *(--reg_cfp->sp);

-   if (proc != Qnil) {
+   if (proc != Qnil || rb_respond_to(Qnil, idTo_proc)) {
        if (!rb_obj_is_proc(proc)) {
        VALUE b;

Updated by ko1 (Koichi Sasada) over 4 years ago

  • Assignee set to matz (Yukihiro Matsumoto)

I'm not sure we support it or not.
For me, it is easy to understand that passing nil is special case, passing no block.

Also available in: Atom PDF