[前][次][番号順一覧][スレッド一覧]

ruby-changes:70451

From: Koichi <ko1@a...>
Date: Thu, 23 Dec 2021 16:50:07 +0900 (JST)
Subject: [ruby-changes:70451] ca032d5eea (master): undef `rb_vm_lookup_overloaded_cme()`

https://git.ruby-lang.org/ruby.git/commit/?id=ca032d5eea

From ca032d5eeaf81692f89f35c55450dcb97df59e16 Mon Sep 17 00:00:00 2001
From: Koichi Sasada <ko1@a...>
Date: Thu, 23 Dec 2021 15:51:13 +0900
Subject: undef `rb_vm_lookup_overloaded_cme()`

Some callable method entries (cme) can be a key of `overloaded_cme_table`
and the keys should be pinned because the table is numtable (VALUE is a key).
Before the patch GC checks the cme is in `overloaded_cme_table` by looking up
the table, but it needs VM locking.

It works well in normal GC marking because it is protected by the VM lock,
but it doesn't work on `rb_objspace_reachable_objects_from` because it doesn't
use VM lock.

Now, the number of target cmes are small enough, I decide to pin down
all possible cmes instead of using looking up the table.
---
 gc.c        | 11 +++++------
 vm_method.c |  3 ++-
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/gc.c b/gc.c
index c4cac9bd076..2de2b98b784 100644
--- a/gc.c
+++ b/gc.c
@@ -6363,8 +6363,6 @@ rb_mark_hash(st_table *tbl) https://github.com/ruby/ruby/blob/trunk/gc.c#L6363
     mark_st(&rb_objspace, tbl);
 }
 
-const rb_callable_method_entry_t *rb_vm_lookup_overloaded_cme(const rb_callable_method_entry_t *cme);
-
 static void
 mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me)
 {
@@ -6378,10 +6376,11 @@ mark_method_entry(rb_objspace_t *objspace, const rb_method_entry_t *me) https://github.com/ruby/ruby/blob/trunk/gc.c#L6376
           case VM_METHOD_TYPE_ISEQ:
             if (def->body.iseq.iseqptr) gc_mark(objspace, (VALUE)def->body.iseq.iseqptr);
             gc_mark(objspace, (VALUE)def->body.iseq.cref);
-            if (def->iseq_overload && me->defined_class) { // cme
-                if (rb_vm_lookup_overloaded_cme((const rb_callable_method_entry_t *)me)) {
-                    gc_mark_and_pin(objspace, (VALUE)me);
-                }
+
+            if (def->iseq_overload && me->defined_class) {
+                // it can be a key of "overloaded_cme" table
+                // so it should be pinned.
+                gc_mark_and_pin(objspace, (VALUE)me);
             }
             break;
 	  case VM_METHOD_TYPE_ATTRSET:
diff --git a/vm_method.c b/vm_method.c
index b8197e14cad..38d03fbe2ba 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -979,12 +979,13 @@ lookup_overloaded_cme(const rb_callable_method_entry_t *cme) https://github.com/ruby/ruby/blob/trunk/vm_method.c#L979
     return monly_cme;
 }
 
-// used by gc.c
+#if VM_CHECK_MODE > 0
 MJIT_FUNC_EXPORTED const rb_callable_method_entry_t *
 rb_vm_lookup_overloaded_cme(const rb_callable_method_entry_t *cme)
 {
     return lookup_overloaded_cme(cme);
 }
+#endif
 
 static void
 delete_overloaded_cme(const rb_callable_method_entry_t *cme)
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]