8000 merge revision(s) 931ac960b6d11937364b6c4e847fdd575ee67980: [Backport… · github/ruby@1d3c198 · GitHub
[go: up one dir, main page]

Skip to content

Commit 1d3c198

Browse files
committed
merge revision(s) 931ac96: [Backport #21159]
[Bug #21159] module names should not be modifiable
1 parent da86a99 commit 1d3c198

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

test/ruby/test_module.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3353,6 +3353,44 @@ def test_module_clone_memory_leak
33533353
CODE
33543354
end
33553355

3356+
def test_set_temporary_name
3357+
m = Module.new
3358+
assert_nil m.name
3359+
3360+
m.const_set(:N, Module.new)
3361+
3362+
assert_match(/\A#<Module:0x\h+>::N\z/, m::N.name)
3363+
m::N.set_temporary_name(name = "fake_name_under_M")
< 8000 /td>3364+
name.upcase!
3365+
assert_equal("fake_name_under_M", m::N.name)
3366+
assert_raise(FrozenError) {m::N.name.upcase!}
3367+
m::N.set_temporary_name(nil)
3368+
assert_nil(m::N.name)
3369+
3370+
m.set_temporary_name(name = "fake_name")
3371+
name.upcase!
3372+
assert_equal("fake_name", m.name)
3373+
assert_raise(FrozenError) {m.name.upcase!}
3374+
3375+
m.set_temporary_name(nil)
3376+
assert_nil m.name
3377+
3378+
assert_raise_with_message(ArgumentError, "empty class/module name") do
3379+
m.set_temporary_name("")
3380+
end
3381+
%w[A A::B ::A ::A::B].each do |name|
3382+
assert_raise_with_message(ArgumentError, /must not be a constant path/) do
3383+
m.set_temporary_name(name)
3384+
end
3385+
end
3386+
3387+
[Object, User, AClass].each do |mod|
3388+
assert_raise_with_message(RuntimeError, /permanent name/) do
3389+
mod.set_temporary_name("fake_name")
3390+
end
3391+
end
3392+
end
3393+
33563394
private
33573395

33583396
def assert_top_method_is_private(method)

variable.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ rb_mod_set_temporary_name(VALUE mod, VALUE name)
228228
rb_raise(rb_eArgError, "the temporary name must not be a constant path to avoid confusion");
229229
}
230230

231+
name = rb_str_new_frozen(name);
232+
231233
// Set the temporary classpath to the given name:
232234
RCLASS_SET_CLASSPATH(mod, name, FALSE);
233235
}

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
1212
#define RUBY_VERSION_TEENY 7
1313
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
14-
#define RUBY_PATCHLEVEL 130
14+
#define RUBY_PATCHLEVEL 131
1515

1616
#include "ruby/version.h"
1717
#include "ruby/internal/abi.h"

0 commit comments

Comments
 (0)
0