Feature #4504

Add rb_funcall_passing_block to public API

Added by James M. Lawrence about 4 years ago. Updated about 4 years ago.

[ruby-core:35501]
Status:Closed
Priority:Normal
Assignee:-

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_passingblock

% nm ruby-1.9-dev/ruby | grep funcall_passing
0018bef0 t rb_funcall_passingblock

% 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

ruby.h.patch Magnifier (507 Bytes) James M. Lawrence, 03/16/2011 07:17 AM

History

#1 Updated by James M. Lawrence about 4 years ago

=begin

=end

#2 Updated by Nobuyoshi Nakada about 4 years ago

  • Status changed from Open to Closed

=begin

=end

Also available in: Atom PDF