ruby-changes:70673
From: NAKAMURA <ko1@a...>
Date: Fri, 31 Dec 2021 19:49:05 +0900 (JST)
Subject: [ruby-changes:70673] 7d3cff6e41 (ruby_2_7): merge revision(s) a2d4e1cda68a49980a4f9f353f400efbde7e7884,d6c5a30cfdf658280338dbb8c8b17fab3190b928: [Backport #18392]
https://git.ruby-lang.org/ruby.git/commit/?id=7d3cff6e41 From 7d3cff6e41d73a00f3d0fdb337743f654e42f1a8 Mon Sep 17 00:00:00 2001 From: NAKAMURA Usaku <usa@r...> Date: Fri, 31 Dec 2021 19:48:17 +0900 Subject: merge revision(s) a2d4e1cda68a49980a4f9f353f400efbde7e7884,d6c5a30cfdf658280338dbb8c8b17fab3190b928: [Backport #18392] Fixed the check order in wmap_live_p [Bug #18392] Check if the object is a pointer to heap before check the flag in that object. --- gc.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) ObjectSpace::WeakMap#inspect: check if living object [Bug #18392] --- gc.c | 29 +++++++++++++++++++++++------ test/ruby/test_weakmap.rb | 9 +++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) --- gc.c | 29 +++++++++++++++++++++++------ test/ruby/test_weakmap.rb | 9 +++++++++ version.h | 2 +- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/gc.c b/gc.c index b06fdc5b27b..67a709ff79b 100644 --- a/gc.c +++ b/gc.c @@ -10516,10 +10516,26 @@ struct wmap_iter_arg { https://github.com/ruby/ruby/blob/trunk/gc.c#L10516 VALUE value; }; +static VALUE +wmap_inspect_append(rb_objspace_t *objspace, VALUE str, VALUE obj) +{ + if (SPECIAL_CONST_P(obj)) { + return rb_str_append(str, rb_inspect(obj)); + } + else if (wmap_live_p(objspace, obj)) { + return rb_str_append(str, rb_any_to_s(obj)); + } + else { + return rb_str_catf(str, "#<collected:%p>", (void*)obj); + } +} + static int wmap_inspect_i(st_data_t key, st_data_t val, st_data_t arg) { - VALUE str = (VALUE)arg; + struct wmap_iter_arg *argp = (struct wmap_iter_arg *)arg; + rb_objspace_t *objspace = argp->objspace; + VALUE str = argp->value; VALUE k = (VALUE)key, v = (VALUE)val; if (RSTRING_PTR(str)[0] == '#') { @@ -10529,11 +10545,9 @@ wmap_inspect_i(st_data_t key, st_data_t val, st_data_t arg) https://github.com/ruby/ruby/blob/trunk/gc.c#L10545 rb_str_cat2(str, ": "); RSTRING_PTR(str)[0] = '#'; } - k = SPECIAL_CONST_P(k) ? rb_inspect(k) : rb_any_to_s(k); - rb_str_append(str, k); + wmap_inspect_append(objspace, str, k); rb_str_cat2(str, " => "); - v = SPECIAL_CONST_P(v) ? rb_inspect(v) : rb_any_to_s(v); - rb_str_append(str, v); + wmap_inspect_append(objspace, str, v); return ST_CONTINUE; } @@ -10544,11 +10558,14 @@ wmap_inspect(VALUE self) https://github.com/ruby/ruby/blob/trunk/gc.c#L10558 VALUE str; VALUE c = rb_class_name(CLASS_OF(self)); struct weakmap *w; + struct wmap_iter_arg args; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); str = rb_sprintf("-<%"PRIsVALUE":%p", c, (void *)self); if (w->wmap2obj) { - st_foreach(w->wmap2obj, wmap_inspect_i, str); + args.objspace = &rb_objspace; + args.value = str; + st_foreach(w->wmap2obj, wmap_inspect_i, (st_data_t)&args); } RSTRING_PTR(str)[0] = '#'; rb_str_cat2(str, ">"); diff --git a/test/ruby/test_weakmap.rb b/test/ruby/test_weakmap.rb index 3b9eef770aa..46d8b50c032 100644 --- a/test/ruby/test_weakmap.rb +++ b/test/ruby/test_weakmap.rb @@ -73,6 +73,15 @@ class TestWeakMap < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_weakmap.rb#L73 @wm.inspect) end + def test_inspect_garbage + 1000.times do |i| + @wm[i] = Object.new + @wm.inspect + end + assert_match(/\A\#<#{@wm.class.name}:[^:]++:(?:\s\d+\s=>\s\#<(?:Object|collected):[^:<>]*+>(?:,|>\z))+/, + @wm.inspect) + end + def test_each m = __callee__[/test_(.*)/, 1] x1 = Object.new diff --git a/version.h b/version.h index 1e9078f3aca..6e13ad932f6 100644 --- a/version.h +++ b/version.h @@ -2,7 +2,7 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L2 # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 6 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 205 +#define RUBY_PATCHLEVEL 206 #define RUBY_RELEASE_YEAR 2021 #define RUBY_RELEASE_MONTH 12 -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/