1
0
Fork 0
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:
nagachika 2020-07-23 17:47:12 +09:00
parent 4437f9eb0b
commit c65aae118c
3 changed files with 33 additions and 9 deletions

View file

@ -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|

View file

@ -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);

View file

@ -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