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

ruby-changes:65764

From: usa <ko1@a...>
Date: Mon, 5 Apr 2021 08:03:25 +0900 (JST)
Subject: [ruby-changes:65764] 942129cdba (ruby_2_6): merge revision(s) de9d6a7a8cb0929e0b4cf0a3120971c7b8ee8927,da5bd0047d6c961105da210c69d4c88421324b70,ce91c5615ca96f357519043181fb5b76b57ee223,c53aebb1d2eb5afbb18f9b3db9f9c956a463a4e1,d05f04d27dd86c67e4a8dfff4392f806cf577bdf: [Backport #16931]

https://git.ruby-lang.org/ruby.git/commit/?id=942129cdba

From 942129cdba1c2f36b7c4f0539df9b1d3e56339e4 Mon Sep 17 00:00:00 2001
From: usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sun, 4 Apr 2021 23:03:14 +0000
Subject: merge revision(s)
 de9d6a7a8cb0929e0b4cf0a3120971c7b8ee8927,da5bd0047d6c961105da210c69d4c88421324b70,ce91c5615ca96f357519043181fb5b76b57ee223,c53aebb1d2eb5afbb18f9b3db9f9c956a463a4e1,d05f04d27dd86c67e4a8dfff4392f806cf577bdf:
 [Backport #16931]

	Split test_defined

	---
	 test/ruby/test_defined.rb | 18 ++++++++++++++++--
	 1 file changed, 16 insertions(+), 2 deletions(-)

	Test for [Bug #16669]

	---
	 test/ruby/test_defined.rb | 8 ++++++++
	 1 file changed, 8 insertions(+)

	Fix typo in test name

	---
	 test/ruby/test_defined.rb | 2 +-
	 1 file changed, 1 insertion(+), 1 deletion(-)

	Split test_defined_method

	---
	 test/ruby/test_defined.rb | 23 ++++++++++++++++++++++-
	 1 file changed, 22 insertions(+), 1 deletion(-)

	Fixed `defined?` against protected method call

	Protected methods are restricted to be called according to the
	class/module in where it is defined, not the actual receiver's
	class.  [Bug #16931]
	---
	 test/ruby/test_defined.rb | 1 +
	 vm_insnhelper.c           | 2 +-
	 2 files changed, 2 insertions(+), 1 deletion(-)

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67920 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 test/ruby/test_defined.rb | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 version.h                 |  2 +-
 vm_insnhelper.c           |  2 +-
 3 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/test/ruby/test_defined.rb b/test/ruby/test_defined.rb
index 9976db3..e1571d5 100644
--- a/test/ruby/test_defined.rb
+++ b/test/ruby/test_defined.rb
@@ -23,40 +23,80 @@ class TestDefined < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_defined.rb#L23
     return !defined?(yield)
   end
 
-  def test_defined
+  def test_defined_global_variable
     $x = nil
 
     assert(defined?($x))		# global variable
     assert_equal('global-variable', defined?($x))# returns description
+  end
 
+  def test_defined_local_variable
     assert_nil(defined?(foo))		# undefined
     foo=5
     assert(defined?(foo))		# local variable
+  end
 
+  def test_defined_constant
     assert(defined?(Array))		# constant
     assert(defined?(::Array))		# toplevel constant
     assert(defined?(File::Constants))	# nested constant
+  end
+
+  def test_defined_public_method
     assert(defined?(Object.new))	# method
     assert(defined?(Object::new))	# method
+  end
+
+  def test_defined_private_method
     assert(!defined?(Object.print))	# private method
+  end
+
+  def test_defined_operator
     assert(defined?(1 == 2))		# operator expression
+  end
 
+  def test_defined_protected_method
     f = Foo.new
     assert_nil(defined?(f.foo))         # protected method
     f.bar(f) { |v| assert(v) }
+    f.bar(Class.new(Foo).new) { |v| assert(v, "inherited protected method") }
+  end
+
+  def test_defined_undefined_method
+    f = Foo.new
     assert_nil(defined?(f.quux))        # undefined method
+  end
+
+  def test_defined_undefined_argument
+    f = Foo.new
     assert_nil(defined?(f.baz(x)))      # undefined argument
     x = 0
     assert(defined?(f.baz(x)))
     assert_nil(defined?(f.quux(x)))
     assert(defined?(print(x)))
     assert_nil(defined?(quux(x)))
+  end
+
+  def test_defined_attrasgn
+    f = Foo.new
     assert(defined?(f.attr = 1))
     f.attrasgn_test { |v| assert(v) }
+  end
+
+  def test_defined_undef
+    x = Object.new
+    def x.foo; end
+    assert(defined?(x.foo))
+    x.instance_eval {undef :foo}
+    assert(!defined?(x.foo), "undefed method should not be defined?")
+  end
 
+  def test_defined_yield
     assert(defined_test)		# not iterator
     assert(!defined_test{})	        # called as iterator
+  end
 
+  def test_defined_matchdata
     /a/ =~ ''
     assert_equal nil, defined?($&)
     assert_equal nil, defined?($`)
@@ -85,12 +125,16 @@ class TestDefined < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_defined.rb#L125
     assert_equal 'global-variable', defined?($+)
     assert_equal 'global-variable', defined?($1)
     assert_equal nil, defined?($2)
+  end
 
+  def test_defined_literal
     assert_equal("nil", defined?(nil))
     assert_equal("true", defined?(true))
     assert_equal("false", defined?(false))
     assert_equal("expression", defined?(1))
+  end
 
+  def test_defined_empty_paren_expr
     bug8224 = '[ruby-core:54024] [Bug #8224]'
     (1..3).each do |level|
       expr = "("*level+")"*level
diff --git a/version.h b/version.h
index ab33c12..92ef088 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L1
 #define RUBY_VERSION "2.6.7"
 #define RUBY_RELEASE_DATE "2021-04-05"
-#define RUBY_PATCHLEVEL 179
+#define RUBY_PATCHLEVEL 180
 
 #define RUBY_RELEASE_YEAR 2021
 #define RUBY_RELEASE_MONTH 4
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 4a47a8e..b3a89fc 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -2858,7 +2858,7 @@ vm_defined(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, rb_num_t op_ https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L2858
 	      case METHOD_VISI_PRIVATE:
 		break;
 	      case METHOD_VISI_PROTECTED:
-		if (!rb_obj_is_kind_of(GET_SELF(), rb_class_real(klass))) {
+		if (!rb_obj_is_kind_of(GET_SELF(), rb_class_real(me->defined_class))) {
 		    break;
 		}
 	      case METHOD_VISI_PUBLIC:
-- 
cgit v1.1


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

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