summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2022-03-11 21:43:47 -0800
committerJeremy Evans <code@jeremyevans.net>2022-06-06 11:12:55 -0700
commitc85d1cda86d75ee2c3f7b42f22c543409cb5a186 (patch)
tree399add0e67c0d5d09932a3c3d05e82c3c3ebf2b5 /variable.c
parent653e517eefaa0c4f2710b30b4dff9a9dad7b9d6a (diff)
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]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5646
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c7
1 files changed, 5 insertions, 2 deletions
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)
.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)
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)
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;