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

ruby-changes:72230

From: nagachika <ko1@a...>
Date: Sat, 18 Jun 2022 16:38:08 +0900 (JST)
Subject: [ruby-changes:72230] 750d4dc3af (ruby_3_1): merge revision(s) 3bb70a6924ddd83f90b508b5bbc4d5629b8a41c6: [Backport #18673]

https://git.ruby-lang.org/ruby.git/commit/?id=750d4dc3af

From 750d4dc3aff7c2fef25fe99f1b98327f68734c9a Mon Sep 17 00:00:00 2001
From: nagachika <nagachika@r...>
Date: Sat, 18 Jun 2022 16:10:51 +0900
Subject: merge revision(s) 3bb70a6924ddd83f90b508b5bbc4d5629b8a41c6: [Backport
 #18673]

	Fix using anonymous block in method accepting explicit keywords

	Record block ID before vtable_pop, so the incorrect one doesn't
	override it.

	Fixes [Bug #18673]
	---
	 parse.y                  |  1 +
	 test/ruby/test_syntax.rb | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
	 2 files changed, 55 insertions(+)
---
 parse.y                  |  1 +
 test/ruby/test_syntax.rb | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
 version.h                |  2 +-
 3 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/parse.y b/parse.y
index 7555d0db16..17c7b38e4c 100644
--- a/parse.y
+++ b/parse.y
@@ -12063,6 +12063,7 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block, https://github.com/ruby/ruby/blob/trunk/parse.y#L12063
 	struct vtable *vtargs = p->lvtbl->args;
 	NODE *kwn = kw_args;
 
+        if (block) block = vtargs->tbl[vtargs->pos-1];
 	vtable_pop(vtargs, !!block + !!kw_rest_arg);
 	required_kw_vars = kw_vars = &vtargs->tbl[vtargs->pos];
 	while (kwn) {
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index b71f492f9c..5dc9bbdaeb 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -75,6 +75,60 @@ class TestSyntax < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_syntax.rb#L75
         a = nil
         b{|c| a = c}
         assert_equal(1, a)
+
+        def inner
+          yield
+        end
+
+        def block_only(&)
+          inner(&)
+        end
+        assert_equal(1, block_only{1})
+
+        def pos(arg1, &)
+          inner(&)
+        end
+        assert_equal(2, pos(nil){2})
+
+        def pos_kwrest(arg1, **kw, &)
+          inner(&)
+        end
+        assert_equal(3, pos_kwrest(nil){3})
+
+        def no_kw(arg1, **nil, &)
+          inner(&)
+        end
+        assert_equal(4, no_kw(nil){4})
+
+        def rest_kw(*a, kwarg: 1, &)
+          inner(&)
+        end
+        assert_equal(5, rest_kw{5})
+
+        def kw(kwarg:1, &)
+          inner(&)
+        end
+        assert_equal(6, kw{6})
+
+        def pos_kw_kwrest(arg1, kwarg:1, **kw, &)
+          inner(&)
+        end
+        assert_equal(7, pos_kw_kwrest(nil){7})
+
+        def pos_rkw(arg1, kwarg1:, &)
+          inner(&)
+        end
+        assert_equal(8, pos_rkw(nil, kwarg1: nil){8})
+
+        def all(arg1, arg2, *rest, post1, post2, kw1: 1, kw2: 2, okw1:, okw2:, &)
+          inner(&)
+        end
+        assert_equal(9, all(nil, nil, nil, nil, okw1: nil, okw2: nil){9})
+
+        def all_kwrest(arg1, arg2, *rest, post1, post2, kw1: 1, kw2: 2, okw1:, okw2:, **kw, &)
+          inner(&)
+        end
+        assert_equal(10, all_kwrest(nil, nil, nil, nil, okw1: nil, okw2: nil){10})
     end;
   end
 
diff --git a/version.h b/version.h
index d9c2de3f62..c282c5df14 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L11
 # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
 #define RUBY_VERSION_TEENY 3
 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 34
+#define RUBY_PATCHLEVEL 35
 
 #define RUBY_RELEASE_YEAR 2022
 #define RUBY_RELEASE_MONTH 6
-- 
cgit v1.2.1


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

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