From: Nobuyoshi Nakada Date: 2011-03-18T19:41:53+09:00 Subject: [ruby-core:35523] [Ruby 1.9 - Feature #4504][Closed] Add rb_funcall_passing_block to public API Issue #4504 has been updated by Nobuyoshi Nakada. Status changed from Open to Closed ---------------------------------------- Feature #4504: Add rb_funcall_passing_block to public API http://redmine.ruby-lang.org/issues/4504 Author: James M. Lawrence Status: Closed Priority: Normal Assignee: Category: Target version: rb_funcall2 fails to pass a block; rb_funcall_passing_block must be used instead. string.c needed it (http://redmine.ruby-lang.org/issues/show/3792), and I need it as well. === test_relay.rb require './relay' module Relay def self.target(*args, &block) p block end end Relay.with_funcall2 { } Relay.with_funcall_passing_block { } === output % ruby extconf.rb && make % ruby -v test_relay.rb ruby 1.9.2p180 (2011-02-18 revision 30907) [i386-darwin9.8.0] nil # === extconf.rb require 'mkmf' create_makefile('relay') === relay.c #include "ruby.h" VALUE rb_funcall_passing_block( VALUE recv, ID mid, int argc, const VALUE *argv) ; static VALUE with_funcall2(int argc, VALUE *argv, VALUE self) { return rb_funcall2( self, rb_intern("target"), argc, argv) ; } static VALUE with_funcall_passing_block(int argc, VALUE *argv, VALUE self) { return rb_funcall_passing_block( self, rb_intern("target"), argc, argv) ; } VALUE cRelay ; void Init_relay() { cRelay = rb_define_module("Relay") ; rb_define_singleton_method(cRelay, "with_funcall2", with_funcall2, -1) ; rb_define_singleton_method(cRelay, "with_funcall_passing_block", with_funcall_passing_block, -1) ; } === 1.9.3 Incidentally the symbol is not even accessible in 1.9.3. % nm ruby-1.9.2/ruby | grep funcall_passing 00188220 T _rb_funcall_passing_block % nm ruby-1.9-dev/ruby | grep funcall_passing 0018bef0 t _rb_funcall_passing_block % make distclean && ruby19dev extconf.rb && make % ruby19dev -v test_relay.rb ruby 1.9.3dev (2011-03-14 trunk 31105) [i386-darwin9.8.0] nil dyld: lazy symbol binding failed: Symbol not found: _rb_funcall_passing_block Referenced from: /Users/jlawrence/tmp/relay/relay.bundle Expected in: flat namespace dyld: Symbol not found: _rb_funcall_passing_block Referenced from: /Users/jlawrence/tmp/relay/relay.bundle Expected in: flat namespace Trace/BPT trap -- http://redmine.ruby-lang.org