@@ -661,7 +661,7 @@ typedef struct RVALUE {
661661        struct  RArray   array ;
662662        struct  RRegexp  regexp ;
663663        struct  RHash    hash ;
664-         struct  RData     data ;
664+         struct  RDataHeader   data ;
665665        struct  RTypedData    typeddata ;
666666        struct  RStruct  rstruct ;
667667        struct  RBignum  bignum ;
@@ -2973,35 +2973,19 @@ rb_wb_protected_newobj_of(rb_execution_context_t *ec, VALUE klass, VALUE flags,
29732973static  inline  void 
29742974rb_data_object_check (VALUE  klass )
29752975{
2976-     if  (klass  !=  rb_cObject  &&  (rb_get_alloc_func (klass ) ==  rb_class_allocate_instance )) {
2977-         rb_undef_alloc_func (klass );
2978-         rb_warn ("undefining the allocator of T_DATA class %" PRIsVALUE , klass );
2979-     }
2980- }
2981- 
2982- VALUE 
2983- rb_data_object_wrap (VALUE  klass , void  * datap , RUBY_DATA_FUNC  dmark , RUBY_DATA_FUNC  dfree )
2984- {
2985-     RUBY_ASSERT_ALWAYS (dfree  !=  (RUBY_DATA_FUNC )1 );
2986-     if  (klass ) rb_data_object_check (klass );
2987-     return  newobj_of (GET_RACTOR (), klass , T_DATA , (VALUE )dmark , (VALUE )dfree , (VALUE )datap , !dmark , sizeof (struct  RTypedData ));
2988- }
2989- 
2990- VALUE 
2991- rb_data_object_zalloc (VALUE  klass , size_t  size , RUBY_DATA_FUNC  dmark , RUBY_DATA_FUNC  dfree )
2992- {
2993-     VALUE  obj  =  rb_data_object_wrap (klass , 0 , dmark , dfree );
2994-     DATA_PTR (obj ) =  xcalloc (1 , size );
2995-     return  obj ;
2976+    if  (klass  !=  rb_cObject  &&  (rb_get_alloc_func (klass ) ==  rb_class_allocate_instance )) {
2977+        rb_undef_alloc_func (klass );
2978+        rb_warn ("undefining the allocator of T_DATA class %" PRIsVALUE , klass );
2979+    }
29962980}
29972981
29982982static  VALUE 
2999- typed_data_alloc (VALUE  klass , VALUE   typed_flag ,  void   * datap ,  const   rb_data_type_t   * type , size_t  size )
2983+ typed_data_alloc (VALUE  klass , const   rb_data_type_t   * type ,  void   * datap , size_t  size )
30002984{
30012985    RBIMPL_NONNULL_ARG (type );
30022986    if  (klass ) rb_data_object_check (klass );
30032987    bool  wb_protected  =  (type -> flags  &  RUBY_FL_WB_PROTECTED ) ||  !type -> function .dmark ;
3004-     return  newobj_of (GET_RACTOR (), klass , T_DATA , (VALUE )type , 1  |  typed_flag ,  (VALUE )datap , wb_protected , size );
2988+     return  newobj_of (GET_RACTOR (), klass , T_DATA , (VALUE )type , (VALUE )datap ,  0 , wb_protected , size );
30052989}
30062990
30072991VALUE 
@@ -3011,7 +2995,7 @@ rb_data_typed_object_wrap(VALUE klass, void *datap, const rb_data_type_t *type)
30112995        rb_raise (rb_eTypeError , "Cannot wrap an embeddable TypedData" );
30122996    }
30132997
3014-     return  typed_data_alloc (klass , 0 , datap ,  type , sizeof (struct  RTypedData ));
2998+     return  typed_data_alloc (klass , type , datap , sizeof (struct  RTypedData ));
30152999}
30163000
30173001VALUE 
@@ -3024,13 +3008,14 @@ rb_data_typed_object_zalloc(VALUE klass, size_t size, const rb_data_type_t *type
30243008
30253009        size_t  embed_size  =  offsetof(struct  RTypedData , data ) +  size ;
30263010        if  (rb_gc_size_allocatable_p (embed_size )) {
3027-             VALUE  obj  =  typed_data_alloc (klass , TYPED_DATA_EMBEDDED ,  0 ,  type , embed_size );
3011+             VALUE  obj  =  typed_data_alloc (klass , type ,  NULL , embed_size );
30283012            memset ((char  * )obj  +  offsetof(struct  RTypedData , data ), 0 , size );
3013+             FL_SET_RAW (obj , TYPED_DATA_FL_EMBEDDED );
30293014            return  obj ;
30303015        }
30313016    }
30323017
3033-     VALUE  obj  =  typed_data_alloc (klass , 0 , NULL ,  type , sizeof (struct  RTypedData ));
3018+     VALUE  obj  =  typed_data_alloc (klass , type , NULL , sizeof (struct  RTypedData ));
30343019    DATA_PTR (obj ) =  xcalloc (1 , size );
30353020    return  obj ;
30363021}
@@ -3043,7 +3028,7 @@ rb_objspace_data_type_memsize(VALUE obj)
30433028        const  rb_data_type_t  * type  =  RTYPEDDATA_TYPE (obj );
30443029        const  void  * ptr  =  RTYPEDDATA_GET_DATA (obj );
30453030
3046-         if  (RTYPEDDATA_TYPE (obj )-> flags  &  RUBY_TYPED_EMBEDDABLE  &&  !RTYPEDDATA_EMBEDDED_P (obj )) {
3031+         if  (RTYPEDDATA_TYPE (obj )-> flags  &  RUBY_TYPED_EMBEDDABLE  &&  !rbimpl_rtypeddata_embedded_p (obj )) {
30473032#ifdef  HAVE_MALLOC_USABLE_SIZE 
30483033            size  +=  malloc_usable_size ((void  * )ptr );
30493034#endif 
@@ -3068,6 +3053,56 @@ rb_objspace_data_type_name(VALUE obj)
30683053    }
30693054}
30703055
3056+ static  void 
3057+ mark_deprecated_rdata_object (void  * ptr )
3058+ {
3059+     struct  RData  * rdata  =  (struct  RData  * )ptr ;
3060+     if  (rdata -> dmark ) {
3061+         rdata -> dmark (rdata );
3062+     }
3063+ }
3064+ 
3065+ static  size_t 
3066+ memsize_deprecated_rdata_object (const  void  * ptr )
3067+ {
3068+     return  sizeof (struct  RData );
3069+ }
3070+ 
3071+ #define  DEPRECATED_DATA_FREE  RBIMPL_DATA_FUNC(-3)
3072+ 
3073+ const  rb_data_type_t  deprecated_rdata_type  =  {
3074+     .wrap_struct_name  =  "RDATA(deprecated)" ,
3075+     .function  =  {
3076+         .dmark  =  mark_deprecated_rdata_object ,
3077+         .dfree  =  DEPRECATED_DATA_FREE ,
3078+         .dsize  =  memsize_deprecated_rdata_object ,
3079+     },
3080+ };
3081+ 
3082+ VALUE 
3083+ rb_data_object_wrap (VALUE  klass , void  * datap , RUBY_DATA_FUNC  dmark , RUBY_DATA_FUNC  dfree )
3084+ {
3085+     RUBY_ASSERT_ALWAYS (dfree  !=  (RUBY_DATA_FUNC )1 );
3086+     if  (klass ) rb_data_object_check (klass );
3087+ 
3088+     VALUE  obj  =  rb_data_typed_object_zalloc (klass , sizeof (struct  RData ), & deprecated_rdata_type );
3089+ 
3090+     struct  RData  * rdata  =  (struct  RData  * )obj ;
3091+     rdata -> dmark  =  dmark ;
3092+     rdata -> dfree  =  dfree ;
3093+     rdata -> data  =  datap ;
3094+     return  obj ;
3095+ }
3096+ 
3097+ VALUE 
3098+ rb_data_object_zalloc (VALUE  klass , size_t  size , RUBY_DATA_FUNC  dmark , RUBY_DATA_FUNC  dfree )
3099+ {
3100+     VALUE  obj  =  rb_data_object_wrap (klass , 0 , dmark , dfree );
3101+     struct  RData  * rdata  =  (struct  RData  * )obj ;
3102+     rdata -> data  =  xcalloc (1 , size );
3103+     return  obj ;
3104+ }
3105+ 
30713106static  int 
30723107ptr_in_page_body_p (const  void  * ptr , const  void  * memb )
30733108{
@@ -3190,31 +3225,29 @@ obj_free_object_id(rb_objspace_t *objspace, VALUE obj)
31903225}
31913226
31923227static  bool 
3193- rb_data_free (rb_objspace_t  * objspace , VALUE  obj )
3228+ rb_typeddata_free (rb_objspace_t  * objspace , VALUE  obj )
31943229{
3195-     void  * data  =  RTYPEDDATA_P ( obj ) ?  RTYPEDDATA_GET_DATA ( obj ) :  DATA_PTR (obj );
3230+     void  * data  =  RTYPEDDATA_GET_DATA (obj );
31963231    if  (data ) {
31973232        int  free_immediately  =  false;
3198-         void  (* dfree )(void  * );
31993233
3200-         if  (RTYPEDDATA_P (obj )) {
3201-             free_immediately  =  (RANY (obj )-> as .typeddata .type -> flags  &  RUBY_TYPED_FREE_IMMEDIATELY ) !=  0 ;
3202-             dfree  =  RANY (obj )-> as .typeddata .type -> function .dfree ;
3203-         }
3204-         else  {
3205-             dfree  =  RANY (obj )-> as .data .dfree ;
3234+         free_immediately  =  (RANY (obj )-> as .typeddata .type -> flags  &  RUBY_TYPED_FREE_IMMEDIATELY ) !=  0 ;
3235+ 
3236+         RUBY_DATA_FUNC  dfree  =  RANY (obj )-> as .typeddata .type -> function .dfree ;
3237+         if  (UNLIKELY (dfree  ==  DEPRECATED_DATA_FREE )) {
3238+             dfree  =  RDATA (obj )-> dfree ;
32063239        }
32073240
32083241        if  (dfree ) {
32093242            if  (dfree  ==  RUBY_DEFAULT_FREE ) {
3210-                 if  (!RTYPEDDATA_EMBEDDED_P (obj )) {
3243+                 if  (!rbimpl_rtypeddata_embedded_p (obj )) {
32113244                    xfree (data );
32123245                    RB_DEBUG_COUNTER_INC (obj_data_xfree );
32133246                }
32143247            }
32153248            else  if  (free_immediately ) {
32163249                (* dfree )(data );
3217-                 if  (RTYPEDDATA_TYPE (obj )-> flags  &  RUBY_TYPED_EMBEDDABLE  &&  !RTYPEDDATA_EMBEDDED_P (obj )) {
3250+                 if  (RTYPEDDATA_TYPE (obj )-> flags  &  RUBY_TYPED_EMBEDDABLE  &&  !rbimpl_rtypeddata_embedded_p (obj )) {
32183251                    xfree (data );
32193252                }
32203253
@@ -3372,7 +3405,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
33723405        }
33733406        break ;
33743407      case  T_DATA :
3375-         if  (!rb_data_free (objspace , obj )) return  false;
3408+         if  (!rb_typeddata_free (objspace , obj )) return  false;
33763409        break ;
33773410      case  T_MATCH :
33783411        {
@@ -4339,7 +4372,7 @@ rb_objspace_call_finalizer_i(VALUE obj, void *data)
43394372
43404373    switch  (BUILTIN_TYPE (obj )) {
43414374      case  T_DATA :
4342-         if  (!rb_free_at_exit  &&  (!DATA_PTR (obj ) ||  !RANY (obj )-> as . data . dfree )) break ;
4375+         if  (!rb_free_at_exit  &&  (!DATA_PTR (obj ) ||  !RDATA (obj )-> dfree )) break ;
43434376        if  (rb_obj_is_thread (obj )) break ;
43444377        if  (rb_obj_is_mutex (obj )) break ;
43454378        if  (rb_obj_is_fiber (obj )) break ;
@@ -6954,20 +6987,18 @@ gc_mark_children(rb_objspace_t *objspace, VALUE obj)
69546987
69556988      case  T_DATA :
69566989        {
6957-             void  * const  ptr  =  RTYPEDDATA_P ( obj ) ?  RTYPEDDATA_GET_DATA ( obj ) :  DATA_PTR (obj );
6990+             void  * const  ptr  =  RTYPEDDATA_GET_DATA (obj );
69586991
69596992            if  (ptr ) {
6960-                 if  (RTYPEDDATA_P ( obj )  &&   gc_declarative_marking_p (any -> as .typeddata .type )) {
6993+                 if  (gc_declarative_marking_p (any -> as .typeddata .type )) {
69616994                    size_t  * offset_list  =  (size_t  * )RANY (obj )-> as .typeddata .type -> function .dmark ;
69626995
69636996                    for  (size_t  offset  =  * offset_list ; offset  !=  RUBY_REF_END ; offset  =  * offset_list ++ ) {
69646997                        rb_gc_mark_movable (* (VALUE  * )((char  * )ptr  +  offset ));
69656998                    }
69666999                }
69677000                else  {
6968-                     RUBY_DATA_FUNC  mark_func  =  RTYPEDDATA_P (obj ) ?
6969-                         any -> as .typeddata .type -> function .dmark  :
6970-                         any -> as .data .dmark ;
7001+                     RUBY_DATA_FUNC  mark_func  =  any -> as .typeddata .type -> function .dmark ;
69717002                    if  (mark_func ) (* mark_func )(ptr );
69727003                }
69737004            }
@@ -10170,9 +10201,9 @@ gc_update_object_references(rb_objspace_t *objspace, VALUE obj)
1017010201      case  T_DATA :
1017110202        /* Call the compaction callback, if it exists */ 
1017210203        {
10173-             void  * const  ptr  =  RTYPEDDATA_P ( obj ) ?  RTYPEDDATA_GET_DATA ( obj ) :  DATA_PTR (obj );
10204+             void  * const  ptr  =  RTYPEDDATA_GET_DATA (obj );
1017410205            if  (ptr ) {
10175-                 if  (RTYPEDDATA_P ( obj )  &&   gc_declarative_marking_p (any -> as .typeddata .type )) {
10206+                 if  (gc_declarative_marking_p (any -> as .typeddata .type )) {
1017610207                    size_t  * offset_list  =  (size_t  * )RANY (obj )-> as .typeddata .type -> function .dmark ;
1017710208
1017810209                    for  (size_t  offset  =  * offset_list ; offset  !=  RUBY_REF_END ; offset  =  * offset_list ++ ) {
@@ -10181,7 +10212,7 @@ gc_update_object_references(rb_objspace_t *objspace, VALUE obj)
1018110212                        * ref  =  rb_gc_location (* ref );
1018210213                    }
1018310214                }
10184-                 else  if  ( RTYPEDDATA_P ( obj ))  {
10215+                 else  {
1018510216                    RUBY_DATA_FUNC  compact_func  =  any -> as .typeddata .type -> function .dcompact ;
1018610217                    if  (compact_func ) (* compact_func )(ptr );
1018710218                }
@@ -13306,7 +13337,7 @@ rb_raw_obj_info_buitin_type(char *const buff, const size_t buff_size, const VALU
1330613337                rb_raw_iseq_info (BUFF_ARGS , iseq );
1330713338            }
1330813339            else  if  (rb_ractor_p (obj )) {
13309-                 rb_ractor_t  * r  =  (void  * )DATA_PTR (obj );
13340+                 rb_ractor_t  * r  =  (void  * )RTYPEDDATA_GET_DATA (obj );
1331013341                if  (r ) {
1331113342                    APPEND_F ("r:%d" , r -> pub .id );
1331213343                }
0 commit comments