[前][次][番号順一覧][スレッド一覧]

ruby-changes:31848

From: nobu <ko1@a...>
Date: Sat, 30 Nov 2013 13:21:36 +0900 (JST)
Subject: [ruby-changes:31848] nobu:r43927 (trunk): vm_eval.c: blockarg

nobu	2013-11-30 13:21:26 +0900 (Sat, 30 Nov 2013)

  New Revision: 43927

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43927

  Log:
    vm_eval.c: blockarg
    
    * vm_eval.c (rb_yield_block): implement non-nil block argument.

  Added files:
    trunk/ext/-test-/iter/init.c
    trunk/ext/-test-/iter/yield.c
    trunk/test/-ext-/iter/test_yield_block.rb
  Modified files:
    trunk/ChangeLog
    trunk/ext/-test-/iter/break.c
    trunk/ext/-test-/iter/extconf.rb
    trunk/test/-ext-/iter/test_iter_break.rb
    trunk/vm_eval.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 43926)
+++ ChangeLog	(revision 43927)
@@ -1,3 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Nov 30 13:21:15 2013  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm_eval.c (rb_yield_block): implement non-nil block argument.
+
 Fri Nov 29 20:59:39 2013  Masaya Tarui  <tarui@r...>
 
 	* vm_dump.c (rb_vmdebug_debug_print_pre): Bugfix. Get PC directly.
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 43926)
+++ vm_eval.c	(revision 43927)
@@ -994,7 +994,9 @@ rb_yield_block(VALUE val, VALUE arg, int https://github.com/ruby/ruby/blob/trunk/vm_eval.c#L994
 {
     const rb_block_t *blockptr = 0;
     if (!NIL_P(blockarg)) {
-	rb_notimplement();
+	rb_proc_t *blockproc;
+	GetProcPtr(blockarg, blockproc);
+	blockptr = &blockproc->block;
     }
     return vm_yield_with_block(GET_THREAD(), argc, argv, blockptr);
 }
Index: ext/-test-/iter/init.c
===================================================================
--- ext/-test-/iter/init.c	(revision 0)
+++ ext/-test-/iter/init.c	(revision 43927)
@@ -0,0 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/iter/init.c#L1
+#include "ruby.h"
+
+#define init(n) {void Init_##n(VALUE klass); Init_##n(klass);}
+
+void
+Init_iter(void)
+{
+    VALUE mBug = rb_define_module("Bug");
+    VALUE klass = rb_define_module_under(mBug, "Iter");
+    TEST_INIT_FUNCS(init);
+}

Property changes on: ext/-test-/iter/init.c
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: ext/-test-/iter/break.c
===================================================================
--- ext/-test-/iter/break.c	(revision 43926)
+++ ext/-test-/iter/break.c	(revision 43927)
@@ -17,9 +17,9 @@ iter_break_value(VALUE self, VALUE val) https://github.com/ruby/ruby/blob/trunk/ext/-test-/iter/break.c#L17
 }
 
 void
-Init_break(void)
+Init_break(VALUE klass)
 {
-    VALUE breakable = rb_define_module_under(rb_define_module("Bug"), "Breakable");
+    VALUE breakable = rb_define_module_under(klass, "Breakable");
     rb_define_module_function(breakable, "iter_break", iter_break, 0);
     rb_define_module_function(breakable, "iter_break_value", iter_break_value, 1);
 }
Index: ext/-test-/iter/yield.c
===================================================================
--- ext/-test-/iter/yield.c	(revision 0)
+++ ext/-test-/iter/yield.c	(revision 43927)
@@ -0,0 +1,16 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/iter/yield.c#L1
+#include <ruby.h>
+
+static VALUE
+yield_block(int argc, VALUE *argv, VALUE self)
+{
+    rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
+    return rb_block_call(self, rb_to_id(argv[0]), argc-1, argv+1, rb_yield_block, 0);
+}
+
+void
+Init_yield(VALUE klass)
+{
+    VALUE yield = rb_define_module_under(klass, "Yield");
+
+    rb_define_method(yield, "yield_block", yield_block, -1);
+}

Property changes on: ext/-test-/iter/yield.c
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: ext/-test-/iter/extconf.rb
===================================================================
--- ext/-test-/iter/extconf.rb	(revision 43926)
+++ ext/-test-/iter/extconf.rb	(revision 43927)
@@ -1 +1,7 @@
-create_makefile("-test-/iter/break")
+$INCFLAGS << " -I$(topdir) -I$(top_srcdir)"
+$srcs = Dir[File.join($srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
+inits = $srcs.map {|s| File.basename(s, ".*")}
+inits.delete("init")
+inits.map! {|s|"X(#{s})"}
+$defs << "-DTEST_INIT_FUNCS(X)=\"#{inits.join(' ')}\""
+create_makefile("-test-/iter")
Index: test/-ext-/iter/test_yield_block.rb
===================================================================
--- test/-ext-/iter/test_yield_block.rb	(revision 0)
+++ test/-ext-/iter/test_yield_block.rb	(revision 43927)
@@ -0,0 +1,21 @@ https://github.com/ruby/ruby/blob/trunk/test/-ext-/iter/test_yield_block.rb#L1
+require 'test/unit'
+require '-test-/iter'
+
+module TestIter
+end
+
+class TestIter::YieldBlock < Test::Unit::TestCase
+  class YieldTest
+    include Bug::Iter::Yield
+    attr_reader :blockarg
+    def test(arg, &block)
+      block.call(arg) {|blockarg| @blockarg = blockarg}
+    end
+  end
+
+  def test_yield_block
+    a = YieldTest.new
+    a.yield_block(:test, "foo") {|x, &b| assert_kind_of(Proc, b); b.call(x)}
+    assert_equal("foo", a.blockarg)
+  end
+end

Property changes on: test/-ext-/iter/test_yield_block.rb
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: test/-ext-/iter/test_iter_break.rb
===================================================================
--- test/-ext-/iter/test_iter_break.rb	(revision 43926)
+++ test/-ext-/iter/test_iter_break.rb	(revision 43927)
@@ -1,12 +1,15 @@ https://github.com/ruby/ruby/blob/trunk/test/-ext-/iter/test_iter_break.rb#L1
 require 'test/unit'
-require '-test-/iter/break'
+require '-test-/iter'
 
-class TestIterBreak < Test::Unit::TestCase
+module TestIter
+end
+
+class TestIter::IterBreak < Test::Unit::TestCase
   def test_iter_break
     backport7896 = '[ruby-core:52607]'
-    assert_equal(nil, 1.times{Bug::Breakable.iter_break}, backport7896)
+    assert_equal(nil, 1.times{Bug::Iter::Breakable.iter_break}, backport7896)
 
     feature5895 = '[ruby-dev:45132]'
-    assert_equal(42, 1.times{Bug::Breakable.iter_break_value(42)}, feature5895)
+    assert_equal(42, 1.times{Bug::Iter::Breakable.iter_break_value(42)}, feature5895)
   end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]