Feature #4504
closedAdd rb_funcall_passing_block to public API
Description
=begin
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
#Proc:0x4153c0@test_relay.rb:10
=== 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
=end
Files