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

ruby-changes:28062

From: nobu <ko1@a...>
Date: Fri, 5 Apr 2013 06:36:49 +0900 (JST)
Subject: [ruby-changes:28062] nobu:r40114 (trunk): object.c: avoid inadvertent symbol creation

nobu	2013-04-05 06:36:38 +0900 (Fri, 05 Apr 2013)

  New Revision: 40114

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

  Log:
    object.c: avoid inadvertent symbol creation
    
    * object.c (rb_mod_cvar_set): fix typo.

  Modified files:
    trunk/object.c
    trunk/test/ruby/test_module.rb
    trunk/test/ruby/test_object.rb

Index: object.c
===================================================================
--- object.c	(revision 40113)
+++ object.c	(revision 40114)
@@ -2296,11 +2296,21 @@ rb_mod_cvar_get(VALUE obj, VALUE iv) https://github.com/ruby/ruby/blob/trunk/object.c#L2296
 static VALUE
 rb_mod_cvar_set(VALUE obj, VALUE iv, VALUE val)
 {
-    ID id = rb_to_id(iv);
+    ID id;
 
-    if (!rb_is_class_id(id)) {
-	rb_name_error(id, "`%"PRIsVALUE"' is not allowed as a class variable name",
-		      QUOTE_ID(id));
+    if (SYMBOL_P(iv)) {
+	id = SYM2ID(iv);
+	if (!rb_is_class_id(id)) {
+	    rb_name_error(id, "`%"PRIsVALUE"' is not allowed as an class variable name",
+			  QUOTE_ID(id));
+	}
+    }
+    else if (!rb_is_class_name(iv)) {
+	rb_name_error_str(iv, "`%"PRIsVALUE"' is not allowed as a class variable name",
+			  QUOTE(iv));
+    }
+    else {
+	id = rb_to_id(iv);
     }
     rb_cvar_set(obj, id, val);
     return val;
Index: test/ruby/test_module.rb
===================================================================
--- test/ruby/test_module.rb	(revision 40113)
+++ test/ruby/test_module.rb	(revision 40114)
@@ -581,6 +581,8 @@ class TestModule < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_module.rb#L581
   def test_const_set_invalid_name
     c1 = Class.new
     assert_raise(NameError) { c1.const_set(:foo, :foo) }
+    assert_raise(NameError) { c1.const_set("bar", :foo) }
+    assert_raise(TypeError) { c1.const_set(1, :foo) }
   end
 
   def test_const_get_invalid_name
@@ -664,6 +666,8 @@ class TestModule < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_module.rb#L666
     assert_equal(:foo, c.class_variable_get(:@@foo))
     assert_raise(NameError) { c.class_variable_get(:@@bar) } # c.f. instance_variable_get
     assert_raise(NameError) { c.class_variable_get(:foo) }
+    assert_raise(NameError) { c.class_variable_get("bar") }
+    assert_raise(TypeError) { c.class_variable_get(1) }
   end
 
   def test_class_variable_set
@@ -671,6 +675,8 @@ class TestModule < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_module.rb#L675
     c.class_variable_set(:@@foo, :foo)
     assert_equal(:foo, c.class_eval('@@foo'))
     assert_raise(NameError) { c.class_variable_set(:foo, 1) }
+    assert_raise(NameError) { c.class_variable_set("bar", 1) }
+    assert_raise(TypeError) { c.class_variable_set(1, 1) }
   end
 
   def test_class_variable_defined
@@ -679,6 +685,8 @@ class TestModule < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_module.rb#L685
     assert_equal(true, c.class_variable_defined?(:@@foo))
     assert_equal(false, c.class_variable_defined?(:@@bar))
     assert_raise(NameError) { c.class_variable_defined?(:foo) }
+    assert_raise(NameError) { c.class_variable_defined?("bar") }
+    assert_raise(TypeError) { c.class_variable_defined?(1) }
   end
 
   def test_remove_class_variable
Index: test/ruby/test_object.rb
===================================================================
--- test/ruby/test_object.rb	(revision 40113)
+++ test/ruby/test_object.rb	(revision 40114)
@@ -174,6 +174,8 @@ class TestObject < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_object.rb#L174
     assert_equal(:foo, o.instance_variable_get(:@foo))
     assert_equal(nil, o.instance_variable_get(:@bar))
     assert_raise(NameError) { o.instance_variable_get(:foo) }
+    assert_raise(NameError) { o.instance_variable_get("bar") }
+    assert_raise(TypeError) { o.instance_variable_get(1) }
   end
 
   def test_instance_variable_set
@@ -181,6 +183,8 @@ class TestObject < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_object.rb#L183
     o.instance_variable_set(:@foo, :foo)
     assert_equal(:foo, o.instance_eval { @foo })
     assert_raise(NameError) { o.instance_variable_set(:foo, 1) }
+    assert_raise(NameError) { o.instance_variable_set("bar", 1) }
+    assert_raise(TypeError) { o.instance_variable_set(1, 1) }
   end
 
   def test_instance_variable_defined
@@ -189,6 +193,8 @@ class TestObject < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_object.rb#L193
     assert_equal(true, o.instance_variable_defined?(:@foo))
     assert_equal(false, o.instance_variable_defined?(:@bar))
     assert_raise(NameError) { o.instance_variable_defined?(:foo) }
+    assert_raise(NameError) { o.instance_variable_defined?("bar") }
+    assert_raise(TypeError) { o.instance_variable_defined?(1) }
   end
 
   def test_remove_instance_variable

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

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