summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-04 21:36:38 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-04 21:36:38 +0000
commit672b8bf1c038fc12d799ad56da3ac860890fe055 (patch)
tree049e4733e014fa65e51832dec1e1a1235834f534
parentdc5b184b1f9c5ab8212b28cee07f5b0edf7aa3c2 (diff)
object.c: avoid inadvertent symbol creation
* object.c (rb_mod_cvar_set): fix typo. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40114 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--object.c18
-rw-r--r--test/ruby/test_module.rb8
-rw-r--r--test/ruby/test_object.rb6
3 files changed, 28 insertions, 4 deletions
diff --git a/object.c b/object.c
index 6861525e8e..355a7569e5 100644
--- a/object.c
+++ b/object.c
@@ -2296,11 +2296,21 @@ rb_mod_cvar_get(VALUE obj, VALUE iv)
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;
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 8e2d5f6333..b11a86a4da 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -581,6 +581,8 @@ class TestModule < Test::Unit::TestCase
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
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
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
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
diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb
index e698398b55..b1df99d76e 100644
--- a/test/ruby/test_object.rb
+++ b/test/ruby/test_object.rb
@@ -174,6 +174,8 @@ class TestObject < Test::Unit::TestCase
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
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
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