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/