@@ -223,6 +223,8 @@ static void DescriptorPool_register(VALUE module) {
223
223
224
224
typedef struct {
225
225
const upb_MessageDef * msgdef ;
226
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
227
+ // macro to update VALUE references, as to trigger write barriers.
226
228
VALUE klass ;
227
229
VALUE descriptor_pool ;
228
230
} Descriptor ;
@@ -238,7 +240,7 @@ static void Descriptor_mark(void* _self) {
238
240
static const rb_data_type_t Descriptor_type = {
239
241
"Google::Protobuf::Descriptor" ,
240
242
{Descriptor_mark , RUBY_DEFAULT_FREE , NULL },
241
- .flags = RUBY_TYPED_FREE_IMMEDIATELY ,
243
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED ,
242
244
};
243
245
244
246
static Descriptor * ruby_to_Descriptor (VALUE val ) {
@@ -280,7 +282,7 @@ static VALUE Descriptor_initialize(VALUE _self, VALUE cookie,
280
282
"Descriptor objects may not be created from Ruby." );
281
283
}
282
284
283
- self -> descriptor_pool = descriptor_pool ;
285
+ RB_OBJ_WRITE ( _self , & self -> descriptor_pool , descriptor_pool ) ;
284
286
self -> msgdef = (const upb_MessageDef * )NUM2ULL (ptr );
285
287
286
288
return Qnil ;
@@ -390,7 +392,7 @@ static VALUE Descriptor_lookup_oneof(VALUE _self, VALUE name) {
390
392
static VALUE Descriptor_msgclass (VALUE _self ) {
391
393
Descriptor * self = ruby_to_Descriptor (_self );
392
394
if (self -> klass == Qnil ) {
393
- self -> klass = build_class_from_descriptor (_self );
395
+ RB_OBJ_WRITE ( _self , & self -> klass , build_class_from_descriptor (_self ) );
394
396
}
395
397
return self -> klass ;
396
398
}
@@ -417,6 +419,8 @@ static void Descriptor_register(VALUE module) {
417
419
418
420
typedef struct {
419
421
const upb_FileDef * filedef ;
422
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
423
+ // macro to update VALUE references, as to trigger write barriers.
420
424
VALUE descriptor_pool ; // Owns the upb_FileDef.
421
425
} FileDescriptor ;
422
426
@@ -430,7 +434,7 @@ static void FileDescriptor_mark(void* _self) {
430
434
static const rb_data_type_t FileDescriptor_type = {
431
435
"Google::Protobuf::FileDescriptor" ,
432
436
{FileDescriptor_mark , RUBY_DEFAULT_FREE , NULL },
433
- .flags = RUBY_TYPED_FREE_IMMEDIATELY ,
437
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED ,
434
438
};
435
439
436
440
static FileDescriptor * ruby_to_FileDescriptor (VALUE val ) {
@@ -463,7 +467,7 @@ static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
463
467
"Descriptor objects may not be created from Ruby." );
464
468
}
465
469
466
- self -> descriptor_pool = descriptor_pool ;
470
+ RB_OBJ_WRITE ( _self , & self -> descriptor_pool , descriptor_pool ) ;
467
471
self -> filedef = (const upb_FileDef * )NUM2ULL (ptr );
468
472
469
473
return Qnil ;
@@ -519,6 +523,8 @@ static void FileDescriptor_register(VALUE module) {
519
523
520
524
typedef struct {
521
525
const upb_FieldDef * fielddef ;
526
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
527
+ // macro to update VALUE references, as to trigger write barriers.
522
528
VALUE descriptor_pool ; // Owns the upb_FieldDef.
523
529
} FieldDescriptor ;
524
530
@@ -532,7 +538,7 @@ static void FieldDescriptor_mark(void* _self) {
532
538
static const rb_data_type_t FieldDescriptor_type = {
533
539
"Google::Protobuf::FieldDescriptor" ,
534
540
{FieldDescriptor_mark , RUBY_DEFAULT_FREE , NULL },
535
- .flags = RUBY_TYPED_FREE_IMMEDIATELY ,
541
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED ,
536
542
};
537
543
538
544
static FieldDescriptor * ruby_to_FieldDescriptor (VALUE val ) {
@@ -570,7 +576,7 @@ static VALUE FieldDescriptor_initialize(VALUE _self, VALUE cookie,
570
576
"Descriptor objects may not be created from Ruby." );
571
577
}
572
578
573
- self -> descriptor_pool = descriptor_pool ;
579
+ RB_OBJ_WRITE ( _self , & self -> descriptor_pool , descriptor_pool ) ;
574
580
self -> fielddef = (const upb_FieldDef * )NUM2ULL (ptr );
575
581
576
582
return Qnil ;
@@ -884,6 +890,8 @@ static void FieldDescriptor_register(VALUE module) {
884
890
885
891
typedef struct {
886
892
const upb_OneofDef * oneofdef ;
893
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
894
+ // macro to update VALUE references, as to trigger write barriers.
887
895
VALUE descriptor_pool ; // Owns the upb_OneofDef.
888
896
} OneofDescriptor ;
889
897
@@ -897,7 +905,7 @@ static void OneofDescriptor_mark(void* _self) {
897
905
static const rb_data_type_t OneofDescriptor_type = {
898
906
"Google::Protobuf::OneofDescriptor" ,
899
907
{OneofDescriptor_mark , RUBY_DEFAULT_FREE , NULL },
900
- .flags = RUBY_TYPED_FREE_IMMEDIATELY ,
908
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED ,
901
909
};
902
910
903
911
static OneofDescriptor * ruby_to_OneofDescriptor (VALUE val ) {
@@ -936,7 +944,7 @@ static VALUE OneofDescriptor_initialize(VALUE _self, VALUE cookie,
936
944
"Descriptor objects may not be created from Ruby." );
937
945
}
938
946
939
- self -> descriptor_pool = descriptor_pool ;
947
+ RB_OBJ_WRITE ( _self , & self -> descriptor_pool , descriptor_pool ) ;
940
948
self -> oneofdef = (const upb_OneofDef * )NUM2ULL (ptr );
941
949
942
950
return Qnil ;
@@ -988,6 +996,8 @@ static void OneofDescriptor_register(VALUE module) {
988
996
989
997
typedef struct {
990
998
const upb_EnumDef * enumdef ;
999
+ // IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
1000
+ // macro to update VALUE references, as to trigger write barriers.
991
1001
VALUE module ; // begins as nil
992
1002
VALUE descriptor_pool ; // Owns the upb_EnumDef.
993
1003
} EnumDescriptor ;
@@ -1003,7 +1013,7 @@ static void EnumDescriptor_mark(void* _self) {
1003
1013
static const rb_data_type_t EnumDescriptor_type = {
1004
1014
"Google::Protobuf::EnumDescriptor" ,
1005
1015
{EnumDescriptor_mark , RUBY_DEFAULT_FREE , NULL },
1006
- .flags = RUBY_TYPED_FREE_IMMEDIATELY ,
1016
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED ,
1007
1017
};
1008
1018
1009
1019
static EnumDescriptor * ruby_to_EnumDescriptor (VALUE val ) {
@@ -1042,7 +1052,7 @@ static VALUE EnumDescriptor_initialize(VALUE _self, VALUE cookie,
1042
1052
"Descriptor objects may not be created from Ruby." );
1043
1053
}
1044
1054
1045
- self -> descriptor_pool = descriptor_pool ;
1055
+ RB_OBJ_WRITE ( _self , & self -> descriptor_pool , descriptor_pool ) ;
1046
1056
self -> enumdef = (const upb_EnumDef * )NUM2ULL (ptr );
1047
1057
1048
1058
return Qnil ;
@@ -1138,7 +1148,7 @@ static VALUE EnumDescriptor_each(VALUE _self) {
1138
1148
static VALUE EnumDescriptor_enummodule (VALUE _self ) {
1139
1149
EnumDescriptor * self = ruby_to_EnumDescriptor (_self );
1140
1150
if (self -> module == Qnil ) {
1141
- self -> module = build_module_from_enumdesc (_self );
1151
+ RB_OBJ_WRITE ( _self , & self -> module , build_module_from_enumdesc (_self ) );
1142
1152
}
1143
1153
return self -> module ;
1144
1154
}
0 commit comments