void RepeatedField_mark(void* _self) { RepeatedField* self = (RepeatedField*)_self; rb_gc_mark(self->field_type_class); upb_fieldtype_t field_type = self->field_type; int element_size = native_slot_size(field_type); for (int i = 0; i < self->size; i++) { void* memory = (((uint8_t *)self->elements) + i * element_size); native_slot_mark(self->field_type, memory); } }
void layout_mark(MessageLayout* layout, void* storage) { upb_msg_field_iter it; for (upb_msg_field_begin(&it, layout->msgdef); !upb_msg_field_done(&it); upb_msg_field_next(&it)) { const upb_fielddef* field = upb_msg_iter_field(&it); void* memory = slot_memory(layout, storage, field); uint32_t* oneof_case = slot_oneof_case(layout, storage, field); if (upb_fielddef_containingoneof(field)) { if (*oneof_case == upb_fielddef_number(field)) { native_slot_mark(upb_fielddef_type(field), memory); } } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) { rb_gc_mark(DEREF(memory, VALUE)); } else { native_slot_mark(upb_fielddef_type(field), memory); } } }
void Map_mark(void* _self) { Map* self = _self; rb_gc_mark(self->value_type_class); if (self->value_type == UPB_TYPE_STRING || self->value_type == UPB_TYPE_BYTES || self->value_type == UPB_TYPE_MESSAGE) { upb_strtable_iter it; for (upb_strtable_begin(&it, &self->table); !upb_strtable_done(&it); upb_strtable_next(&it)) { upb_value v = upb_strtable_iter_value(&it); void* mem = value_memory(&v); native_slot_mark(self->value_type, mem); } } }