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

ruby-changes:29601

From: usa <ko1@a...>
Date: Wed, 26 Jun 2013 17:12:02 +0900 (JST)
Subject: [ruby-changes:29601] usa:r41653 (ruby_1_9_3): merge revision(s) 41343,41360,41386: [Backport #8531]

usa	2013-06-26 17:11:48 +0900 (Wed, 26 Jun 2013)

  New Revision: 41653

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

  Log:
    merge revision(s) 41343,41360,41386: [Backport #8531]
    
    test/ruby/test_symbol.rb: tests for [Bug #8531]
    * include/ruby/ruby.h, vm_eval.c (rb_funcall_with_block):
      new function to invoke a method with a block passed
      as an argument.
    
    * string.c (sym_call): use the above function to avoid
      a block sharing. [ruby-dev:47438] [Bug #8531]
    
    * vm_insnhelper.c (vm_yield_with_cfunc): don't set block
      in the frame.
    
    * test/ruby/test_symbol.rb (TestSymbol#test_block_given_to_proc):
      run related tests.

  Modified directories:
    branches/ruby_1_9_3/
  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/include/ruby/ruby.h
    branches/ruby_1_9_3/string.c
    branches/ruby_1_9_3/test/ruby/test_symbol.rb
    branches/ruby_1_9_3/version.h
    branches/ruby_1_9_3/vm_eval.c

Index: ruby_1_9_3/include/ruby/ruby.h
===================================================================
--- ruby_1_9_3/include/ruby/ruby.h	(revision 41652)
+++ ruby_1_9_3/include/ruby/ruby.h	(revision 41653)
@@ -1153,6 +1153,7 @@ VALUE rb_funcall(VALUE, ID, int, ...); https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/include/ruby/ruby.h#L1153
 VALUE rb_funcall2(VALUE, ID, int, const VALUE*);
 VALUE rb_funcall3(VALUE, ID, int, const VALUE*);
 VALUE rb_funcall_passing_block(VALUE, ID, int, const VALUE*);
+VALUE rb_funcall_with_block(VALUE, ID, int, const VALUE*, VALUE);
 int rb_scan_args(int, const VALUE*, const char*, ...);
 VALUE rb_call_super(int, const VALUE*);
 
Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 41652)
+++ ruby_1_9_3/ChangeLog	(revision 41653)
@@ -1,3 +1,18 @@ https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/ChangeLog#L1
+Wed Jun 26 17:08:13 2013  Kazuki Tsujimoto  <kazuki@c...>
+
+	* include/ruby/ruby.h, vm_eval.c (rb_funcall_with_block):
+	  new function to invoke a method with a block passed
+	  as an argument.
+
+	* string.c (sym_call): use the above function to avoid
+	  a block sharing. [ruby-dev:47438] [Bug #8531]
+
+	* vm_insnhelper.c (vm_yield_with_cfunc): don't set block
+	  in the frame.
+
+	* test/ruby/test_symbol.rb (TestSymbol#test_block_given_to_proc):
+	  run related tests.
+
 Wed Jun 26 17:01:22 2013  NAKAMURA Usaku  <usa@r...>
 
 	* benchmark/bm_hash_shift.rb: add benchmark for Hash#shift
Index: ruby_1_9_3/string.c
===================================================================
--- ruby_1_9_3/string.c	(revision 41652)
+++ ruby_1_9_3/string.c	(revision 41653)
@@ -7512,7 +7512,7 @@ sym_to_sym(VALUE sym) https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/string.c#L7512
 }
 
 static VALUE
-sym_call(VALUE args, VALUE sym, int argc, VALUE *argv)
+sym_call(VALUE args, VALUE sym, int argc, VALUE *argv, VALUE passed_proc)
 {
     VALUE obj;
 
@@ -7520,7 +7520,7 @@ sym_call(VALUE args, VALUE sym, int argc https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/string.c#L7520
 	rb_raise(rb_eArgError, "no receiver given");
     }
     obj = argv[0];
-    return rb_funcall_passing_block(obj, (ID)sym, argc - 1, argv + 1);
+    return rb_funcall_with_block(obj, (ID)sym, argc - 1, argv + 1, passed_proc);
 }
 
 /*
Index: ruby_1_9_3/vm_eval.c
===================================================================
--- ruby_1_9_3/vm_eval.c	(revision 41652)
+++ ruby_1_9_3/vm_eval.c	(revision 41653)
@@ -694,6 +694,23 @@ rb_funcall_passing_block(VALUE recv, ID https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/vm_eval.c#L694
     return rb_call(recv, mid, argc, argv, CALL_PUBLIC);
 }
 
+VALUE
+rb_funcall_with_block(VALUE recv, ID mid, int argc, const VALUE *argv, VALUE pass_procval)
+{
+    if (!NIL_P(pass_procval)) {
+	rb_thread_t *th = GET_THREAD();
+	rb_block_t *block = 0;
+
+	rb_proc_t *pass_proc;
+	GetProcPtr(pass_procval, pass_proc);
+	block = &pass_proc->block;
+
+	th->passed_block = block;
+    }
+
+    return rb_call(recv, mid, argc, argv, CALL_PUBLIC);
+}
+
 static VALUE
 send_internal(int argc, const VALUE *argv, VALUE recv, call_type scope)
 {
Index: ruby_1_9_3/version.h
===================================================================
--- ruby_1_9_3/version.h	(revision 41652)
+++ ruby_1_9_3/version.h	(revision 41653)
@@ -1,5 +1,5 @@ https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/version.h#L1
 #define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 444
+#define RUBY_PATCHLEVEL 445
 
 #define RUBY_RELEASE_DATE "2013-06-26"
 #define RUBY_RELEASE_YEAR 2013
Index: ruby_1_9_3/test/ruby/test_symbol.rb
===================================================================
--- ruby_1_9_3/test/ruby/test_symbol.rb	(revision 41652)
+++ ruby_1_9_3/test/ruby/test_symbol.rb	(revision 41653)
@@ -33,7 +33,7 @@ class TestSymbol < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/test/ruby/test_symbol.rb#L33
     assert_inspect_evaled(':foo')
     assert_inspect_evaled(':foo!')
     assert_inspect_evaled(':bar?')
-    assert_inspect_evaled(':<<')
+    assert_inspect_evaled(":<<")
     assert_inspect_evaled(':>>')
     assert_inspect_evaled(':<=')
     assert_inspect_evaled(':>=')
@@ -102,6 +102,33 @@ class TestSymbol < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/test/ruby/test_symbol.rb#L102
     assert_raise(ArgumentError) { :foo.to_proc.call }
   end
 
+  def m_block_given?
+    block_given?
+  end
+
+  def m2_block_given?(m = nil)
+    if m
+      [block_given?, m.call(self)]
+    else
+      block_given?
+    end
+  end
+
+  def test_block_given_to_proc
+    bug8531 = '[Bug #8531]'
+    m = :m_block_given?.to_proc
+    assert(!m.call(self), "#{bug8531} without block")
+    assert(m.call(self) {}, "#{bug8531} with block")
+    assert(!m.call(self), "#{bug8531} without block second")
+  end
+
+  def test_block_persist_between_calls
+    bug8531 = '[Bug #8531]'
+    m2 = :m2_block_given?.to_proc
+    assert_equal([true, false], m2.call(self, m2) {}, "#{bug8531} nested with block")
+    assert_equal([false, false], m2.call(self, m2), "#{bug8531} nested without block")
+  end
+
   def test_succ
     assert_equal(:fop, :foo.succ)
   end

Property changes on: ruby_1_9_3
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r41343,41360,41386


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

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