ruby-changes:72076
From: Jeremy <ko1@a...>
Date: Tue, 7 Jun 2022 03:13:07 +0900 (JST)
Subject: [ruby-changes:72076] c85d1cda86 (master): Fix Module#const_source_location for autoload constants with direct requires
https://git.ruby-lang.org/ruby.git/commit/?id=c85d1cda86 From c85d1cda86d75ee2c3f7b42f22c543409cb5a186 Mon Sep 17 00:00:00 2001 From: Jeremy Evans <code@j...> Date: Fri, 11 Mar 2022 21:43:47 -0800 Subject: Fix Module#const_source_location for autoload constants with direct requires If an autoload exists for a constant, but the path for the autoload was required, const_source_location would return [false, 0] instead of the actual file and line. This fixes it by setting the appropriate file and line in rb_const_set, and saving the file and line in const_tbl_update before they get reset by current_autoload_data. Fixes [Bug #18624] --- test/ruby/test_autoload.rb | 17 +++++++++++++++++ variable.c | 7 +++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/test/ruby/test_autoload.rb b/test/ruby/test_autoload.rb index bac6337eb9..bd875ec008 100644 --- a/test/ruby/test_autoload.rb +++ b/test/ruby/test_autoload.rb @@ -443,6 +443,23 @@ p Foo::Bar https://github.com/ruby/ruby/blob/trunk/test/ruby/test_autoload.rb#L443 end end + def test_source_location_after_require + bug = "Bug18624" + Dir.mktmpdir('autoload') do |tmpdir| + path = "#{tmpdir}/test-#{bug}.rb" + File.write(path, "C::#{bug} = __FILE__\n") + assert_separately(%W[-I #{tmpdir}], "#{<<-"begin;"}\n#{<<-"end;"}") + begin; + class C; end + C.autoload(:Bug18624, #{path.dump}) + require #{path.dump} + assert_equal [#{path.dump}, 1], C.const_source_location(#{bug.dump}) + assert_equal #{path.dump}, C.const_get(#{bug.dump}) + assert_equal [#{path.dump}, 1], C.const_source_location(#{bug.dump}) + end; + end + end + def test_no_memory_leak assert_no_memory_leak([], '', "#{<<~"begin;"}\n#{<<~'end;'}", 'many autoloads', timeout: 60) begin; diff --git a/variable.c b/variable.c index c3414d61c4..bf48e711f0 100644 --- a/variable.c +++ b/variable.c @@ -3264,6 +3264,7 @@ const_set(VALUE klass, ID id, VALUE val) https://github.com/ruby/ruby/blob/trunk/variable.c#L3264 .value = val, .flag = CONST_PUBLIC, /* fill the rest with 0 */ }; + ac.file = rb_source_location(&ac.line); const_tbl_update(&ac, false); } } @@ -3337,6 +3338,8 @@ const_tbl_update(struct autoload_const *ac, int autoload_force) https://github.com/ruby/ruby/blob/trunk/variable.c#L3338 ce = (rb_const_entry_t *)value; if (ce->value == Qundef) { RUBY_ASSERT_CRITICAL_SECTION_ENTER(); + VALUE file = ac->file; + int line = ac->line; struct autoload_data *ele = autoload_data_for_named_constant(klass, id, &ac); if (!autoload_force && ele) { @@ -3350,8 +3353,8 @@ const_tbl_update(struct autoload_const *ac, int autoload_force) https://github.com/ruby/ruby/blob/trunk/variable.c#L3353 autoload_delete(klass, id); ce->flag = visibility; RB_OBJ_WRITE(klass, &ce->value, val); - RB_OBJ_WRITE(klass, &ce->file, ac->file); - ce->line = ac->line; + RB_OBJ_WRITE(klass, &ce->file, file); + ce->line = line; } RUBY_ASSERT_CRITICAL_SECTION_LEAVE(); return; -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/