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

ruby-changes:69707

From: Matt <ko1@a...>
Date: Fri, 12 Nov 2021 03:48:06 +0900 (JST)
Subject: [ruby-changes:69707] a9a94540d6 (master): Remove RCLASS(obj)->ptr when RVARGC is enabled

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

From a9a94540d68b523ecc4e2181e50b320cd5d176f1 Mon Sep 17 00:00:00 2001
From: Matt Valentine-House <matt@e...>
Date: Wed, 10 Nov 2021 21:33:17 +0000
Subject: Remove RCLASS(obj)->ptr when RVARGC is enabled

With RVARGC we always store the rb_classext_t in the same slot as the
RClass struct that refers to it. So we don't need to store the pointer
or access through the pointer anymore and can switch the RCLASS_EXT
macro to use an offset
---
 class.c          | 4 +---
 gc.c             | 8 ++++----
 internal/class.h | 8 +++++++-
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/class.c b/class.c
index f5090d7f0f7..01939f50088 100644
--- a/class.c
+++ b/class.c
@@ -177,9 +177,7 @@ class_alloc(VALUE flags, VALUE klass) https://github.com/ruby/ruby/blob/trunk/class.c#L177
 
     RVARGC_NEWOBJ_OF(obj, struct RClass, klass, (flags & T_MASK) | FL_PROMOTED1 /* start from age == 2 */ | (RGENGC_WB_PROTECTED_CLASS ? FL_WB_PROTECTED : 0), alloc_size);
 
-#if USE_RVARGC
-    obj->ptr = (rb_classext_t *)((char *)obj + sizeof(struct RClass));
-#else
+#if !USE_RVARGC
     obj->ptr = ZALLOC(rb_classext_t);
 #endif
 
diff --git a/gc.c b/gc.c
index 94c7f60c95e..2c64460541e 100644
--- a/gc.c
+++ b/gc.c
@@ -4588,11 +4588,11 @@ obj_memsize_of(VALUE obj, int use_all_types) https://github.com/ruby/ruby/blob/trunk/gc.c#L4588
                 // TODO: more correct value
 		size += st_memsize(RCLASS_IV_INDEX_TBL(obj));
 	    }
-	    if (RCLASS(obj)->ptr->iv_tbl) {
-		size += st_memsize(RCLASS(obj)->ptr->iv_tbl);
+            if (RCLASS_EXT(obj)->iv_tbl) {
+                size += st_memsize(RCLASS_EXT(obj)->iv_tbl);
 	    }
-	    if (RCLASS(obj)->ptr->const_tbl) {
-		size += rb_id_table_memsize(RCLASS(obj)->ptr->const_tbl);
+            if (RCLASS_EXT(obj)->const_tbl) {
+                size += rb_id_table_memsize(RCLASS_EXT(obj)->const_tbl);
 	    }
             if (RCLASS_CC_TBL(obj)) {
                 size += cc_table_memsize(RCLASS_CC_TBL(obj));
diff --git a/internal/class.h b/internal/class.h
index a949bfb3e65..ee36ad1967f 100644
--- a/internal/class.h
+++ b/internal/class.h
@@ -66,7 +66,9 @@ struct rb_classext_struct { https://github.com/ruby/ruby/blob/trunk/internal/class.h#L66
 struct RClass {
     struct RBasic basic;
     VALUE super;
+#if !USE_RVARGC
     struct rb_classext_struct *ptr;
+#endif
 #if SIZEOF_SERIAL_T == SIZEOF_VALUE
     /* Class serial is as wide as VALUE.  Place it here. */
     rb_serial_t class_serial;
@@ -79,7 +81,11 @@ struct RClass { https://github.com/ruby/ruby/blob/trunk/internal/class.h#L81
 typedef struct rb_subclass_entry rb_subclass_entry_t;
 typedef struct rb_classext_struct rb_classext_t;
 
-#define RCLASS_EXT(c) (RCLASS(c)->ptr)
+#if USE_RVARGC
+#  define RCLASS_EXT(c) ((rb_classext_t *)((char *)c + sizeof(struct RClass)))
+#else
+#  define RCLASS_EXT(c) (RCLASS(c)->ptr)
+#endif
 #define RCLASS_IV_TBL(c) (RCLASS_EXT(c)->iv_tbl)
 #define RCLASS_CONST_TBL(c) (RCLASS_EXT(c)->const_tbl)
 #if SIZEOF_SERIAL_T == SIZEOF_VALUE
-- 
cgit v1.2.1


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

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