1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Don't accidentally name anonymous module/class

b00f280d4b introduced
an accidental behavior change in that defining a module/class under
`m` gives `m` a name when `m` is anonymous.

`ruby -ve 'Module.new { class self::A; end; p name }'` outputs a name
similar to `Module#inspect` when it should output `nil` like in Ruby
2.6.x.

 * variable.c: Use `make_temporary_path` instead of `save_temporary_path`
   when getting the name of the parent module.

 * variable.c (rb_set_class_path): Delegate to `rb_set_class_path_string`
   instead of duplicating the logic.

[Bug #16097]
This commit is contained in:
Alan Wu 2019-08-10 17:32:49 -04:00 committed by Nobuyoshi Nakada
parent 1cffd5b4f0
commit c8f97596b7
Notes: git 2019-08-31 04:40:14 +09:00
2 changed files with 21 additions and 23 deletions

View file

@ -565,6 +565,24 @@ class TestModule < Test::Unit::TestCase
assert_equal("TestModule::User", User.name)
end
def test_accidental_singleton_naming_with_module
o = Object.new
assert_nil(o.singleton_class.name)
class << o
module Hi; end
end
assert_nil(o.singleton_class.name)
end
def test_accidental_singleton_naming_with_class
o = Object.new
assert_nil(o.singleton_class.name)
class << o
class Hi; end
end
assert_nil(o.singleton_class.name)
end
def test_classpath
m = Module.new
n = Module.new

View file

@ -186,12 +186,6 @@ rb_search_class_path(VALUE klass)
return rb_tmp_class_path(klass, &permanent, no_fallback);
}
static VALUE
save_temporary_path(VALUE obj, VALUE name)
{
return rb_ivar_set(obj, tmp_classpath, make_temporary_path(obj, name));
}
static VALUE
build_const_pathname(VALUE head, VALUE tail)
{
@ -219,7 +213,7 @@ rb_set_class_path_string(VALUE klass, VALUE under, VALUE name)
}
else {
int permanent;
str = rb_tmp_class_path(under, &permanent, save_temporary_path);
str = rb_tmp_class_path(under, &permanent, make_temporary_path);
str = build_const_pathname(str, name);
if (!permanent) {
pathid = tmp_classpath;
@ -231,23 +225,9 @@ rb_set_class_path_string(VALUE klass, VALUE under, VALUE name)
void
rb_set_class_path(VALUE klass, VALUE under, const char *name)
{
VALUE str;
ID pathid = classpath;
if (under == rb_cObject) {
str = rb_str_new2(name);
}
else {
int permanent;
str = rb_str_dup(rb_tmp_class_path(under, &permanent, save_temporary_path));
rb_str_cat2(str, "::");
rb_str_cat2(str, name);
if (!permanent) {
pathid = tmp_classpath;
}
}
VALUE str = rb_str_new2(name);
OBJ_FREEZE(str);
rb_ivar_set(klass, pathid, str);
rb_set_class_path_string(klass, under, str);
}
VALUE