mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
merge revision(s) 927308108c: [Backport #16764]
Fix source location of autoloaded constant [Bug #16764]
This commit is contained in:
parent
4437f9eb0b
commit
c65aae118c
3 changed files with 33 additions and 9 deletions
|
|
@ -425,6 +425,19 @@ p Foo::Bar
|
|||
end
|
||||
end
|
||||
|
||||
def test_source_location
|
||||
klass = self.class
|
||||
bug = "Bug16764"
|
||||
Dir.mktmpdir('autoload') do |tmpdir|
|
||||
path = "#{tmpdir}/test-#{bug}.rb"
|
||||
File.write(path, "#{klass}::#{bug} = __FILE__\n")
|
||||
klass.autoload(:Bug16764, path)
|
||||
assert_equal [__FILE__, __LINE__-1], klass.const_source_location(bug)
|
||||
assert_equal path, klass.const_get(bug)
|
||||
assert_equal [path, 1], klass.const_source_location(bug)
|
||||
end
|
||||
end
|
||||
|
||||
def test_no_leak
|
||||
assert_no_memory_leak([], '', <<~'end;', 'many autoloads', timeout: 60)
|
||||
200000.times do |i|
|
||||
|
|
|
|||
27
variable.c
27
variable.c
|
|
@ -1802,8 +1802,10 @@ struct autoload_const {
|
|||
VALUE mod;
|
||||
VALUE ad; /* autoload_data_i */
|
||||
VALUE value;
|
||||
VALUE file;
|
||||
ID id;
|
||||
rb_const_flag_t flag;
|
||||
int line;
|
||||
};
|
||||
|
||||
/* always on stack, no need to mark */
|
||||
|
|
@ -1872,6 +1874,7 @@ autoload_c_compact(void *ptr)
|
|||
ac->mod = rb_gc_location(ac->mod);
|
||||
ac->ad = rb_gc_location(ac->ad);
|
||||
ac->value = rb_gc_location(ac->value);
|
||||
ac->file = rb_gc_location(ac->file);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1882,6 +1885,7 @@ autoload_c_mark(void *ptr)
|
|||
rb_gc_mark_movable(ac->mod);
|
||||
rb_gc_mark_movable(ac->ad);
|
||||
rb_gc_mark_movable(ac->value);
|
||||
rb_gc_mark_movable(ac->file);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -2768,11 +2772,11 @@ rb_const_set(VALUE klass, ID id, VALUE val)
|
|||
setup_const_entry(ce, klass, val, CONST_PUBLIC);
|
||||
}
|
||||
else {
|
||||
struct autoload_const ac;
|
||||
ac.mod = klass;
|
||||
ac.id = id;
|
||||
ac.value = val;
|
||||
ac.flag = CONST_PUBLIC;
|
||||
struct autoload_const ac = {
|
||||
.mod = klass, .id = id,
|
||||
.value = val, .flag = CONST_PUBLIC,
|
||||
/* fill the rest with 0 */
|
||||
};
|
||||
const_tbl_update(&ac);
|
||||
}
|
||||
/*
|
||||
|
|
@ -2837,10 +2841,17 @@ const_tbl_update(struct autoload_const *ac)
|
|||
rb_clear_constant_cache();
|
||||
|
||||
ac->value = val; /* autoload_i is non-WB-protected */
|
||||
return;
|
||||
ac->file = rb_source_location(&ac->line);
|
||||
}
|
||||
/* otherwise, allow to override */
|
||||
autoload_delete(klass, id);
|
||||
else {
|
||||
/* otherwise autoloaded constant, allow to override */
|
||||
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;
|
||||
}
|
||||
return;
|
||||
}
|
||||
else {
|
||||
VALUE name = QUOTE_ID(id);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
|
||||
#define RUBY_VERSION_TEENY 1
|
||||
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
|
||||
#define RUBY_PATCHLEVEL 106
|
||||
#define RUBY_PATCHLEVEL 107
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2020
|
||||
#define RUBY_RELEASE_MONTH 7
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue