Skip to content

Commit 31313b1

Browse files
habermancopybara-github
authored andcommitted
Breaking Change: freeze is now recursive, affecting all sub-messages, maps, and repeated fields.
PiperOrigin-RevId: 595779782
1 parent 8d36600 commit 31313b1

File tree

18 files changed

+86
-103
lines changed

18 files changed

+86
-103
lines changed

ruby/ext/google/protobuf_c/map.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -563,30 +563,21 @@ VALUE Map_eq(VALUE _self, VALUE _other) {
563563
* Freezes the message object. We have to intercept this so we can pin the
564564
* Ruby object into memory so we don't forget it's frozen.
565565
*/
566-
static VALUE Map_freeze(VALUE _self) {
566+
VALUE Map_freeze(VALUE _self) {
567567
Map* self = ruby_to_Map(_self);
568-
if (!RB_OBJ_FROZEN(_self)) {
569-
Arena_Pin(self->arena, _self);
570-
RB_OBJ_FREEZE(_self);
571-
}
572-
return _self;
573-
}
574568

575-
/*
576-
* Deep freezes the map and values recursively.
577-
* Internal use only.
578-
*/
579-
VALUE Map_internal_deep_freeze(VALUE _self) {
580-
Map* self = ruby_to_Map(_self);
581-
Map_freeze(_self);
569+
if (RB_OBJ_FROZEN(_self)) return _self;
570+
Arena_Pin(self->arena, _self);
571+
RB_OBJ_FREEZE(_self);
572+
582573
if (self->value_type_info.type == kUpb_CType_Message) {
583574
size_t iter = kUpb_Map_Begin;
584575
upb_MessageValue key, val;
585576

586577
while (upb_Map_Next(self->map, &key, &val, &iter)) {
587578
VALUE val_val =
588579
Convert_UpbToRuby(val, self->value_type_info, self->arena);
589-
Message_internal_deep_freeze(val_val);
580+
Message_freeze(val_val);
590581
}
591582
}
592583
return _self;

ruby/ext/google/protobuf_c/map.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ extern VALUE cMap;
3939
void Map_register(VALUE module);
4040

4141
// Recursively freeze map
42-
VALUE Map_internal_deep_freeze(VALUE _self);
42+
VALUE Map_freeze(VALUE _self);
4343

4444
#endif // RUBY_PROTOBUF_MAP_H_

ruby/ext/google/protobuf_c/message.c

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -826,22 +826,12 @@ static VALUE Message_to_h(VALUE _self) {
826826
* Freezes the message object. We have to intercept this so we can pin the
827827
* Ruby object into memory so we don't forget it's frozen.
828828
*/
829-
static VALUE Message_freeze(VALUE _self) {
829+
VALUE Message_freeze(VALUE _self) {
830830
Message* self = ruby_to_Message(_self);
831-
if (!RB_OBJ_FROZEN(_self)) {
832-
Arena_Pin(self->arena, _self);
833-
RB_OBJ_FREEZE(_self);
834-
}
835-
return _self;
836-
}
837831

838-
/*
839-
* Deep freezes the message object recursively.
840-
* Internal use only.
841-
*/
842-
VALUE Message_internal_deep_freeze(VALUE _self) {
843-
Message* self = ruby_to_Message(_self);
844-
Message_freeze(_self);
832+
if (RB_OBJ_FROZEN(_self)) return _self;
833+
Arena_Pin(self->arena, _self);
834+
RB_OBJ_FREEZE(_self);
845835

846836
int n = upb_MessageDef_FieldCount(self->msgdef);
847837
for (int i = 0; i < n; i++) {
@@ -850,11 +840,11 @@ VALUE Message_internal_deep_freeze(VALUE _self) {
850840

851841
if (field != Qnil) {
852842
if (upb_FieldDef_IsMap(f)) {
853-
Map_internal_deep_freeze(field);
843+
Map_freeze(field);
854844
} else if (upb_FieldDef_IsRepeated(f)) {
855-
RepeatedField_internal_deep_freeze(field);
845+
RepeatedField_freeze(field);
856846
} else if (upb_FieldDef_IsSubMessage(f)) {
857-
Message_internal_deep_freeze(field);
847+
Message_freeze(field);
858848
}
859849
}
860850
}
@@ -963,7 +953,7 @@ VALUE Message_decode_bytes(int size, const char* bytes, int options,
963953
rb_raise(cParseError, "Error occurred during parsing");
964954
}
965955
if (freeze) {
966-
Message_internal_deep_freeze(msg_rb);
956+
Message_freeze(msg_rb);
967957
}
968958
return msg_rb;
969959
}

ruby/ext/google/protobuf_c/message.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ VALUE Message_decode_bytes(int size, const char* bytes, int options,
7878
VALUE klass, bool freeze);
7979

8080
// Recursively freeze message
81-
VALUE Message_internal_deep_freeze(VALUE _self);
81+
VALUE Message_freeze(VALUE _self);
8282

8383
// Call at startup to register all types in this module.
8484
void Message_register(VALUE protobuf);

ruby/ext/google/protobuf_c/repeated_field.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -478,29 +478,20 @@ VALUE RepeatedField_eq(VALUE _self, VALUE _other) {
478478
* Freezes the repeated field. We have to intercept this so we can pin the Ruby
479479
* object into memory so we don't forget it's frozen.
480480
*/
481-
static VALUE RepeatedField_freeze(VALUE _self) {
481+
VALUE RepeatedField_freeze(VALUE _self) {
482482
RepeatedField* self = ruby_to_RepeatedField(_self);
483-
if (!RB_OBJ_FROZEN(_self)) {
484-
Arena_Pin(self->arena, _self);
485-
RB_OBJ_FREEZE(_self);
486-
}
487-
return _self;
488-
}
489483

490-
/*
491-
* Deep freezes the repeated field and values recursively.
492-
* Internal use only.
493-
*/
494-
VALUE RepeatedField_internal_deep_freeze(VALUE _self) {
495-
RepeatedField* self = ruby_to_RepeatedField(_self);
496-
RepeatedField_freeze(_self);
484+
if (RB_OBJ_FROZEN(_self)) return _self;
485+
Arena_Pin(self->arena, _self);
486+
RB_OBJ_FREEZE(_self);
487+
497488
if (self->type_info.type == kUpb_CType_Message) {
498489
int size = upb_Array_Size(self->array);
499490
int i;
500491
for (i = 0; i < size; i++) {
501492
upb_MessageValue msgval = upb_Array_Get(self->array, i);
502493
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
503-
Message_internal_deep_freeze(val);
494+
Message_freeze(val);
504495
}
505496
}
506497
return _self;

ruby/ext/google/protobuf_c/repeated_field.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ extern VALUE cRepeatedField;
3636
void RepeatedField_register(VALUE module);
3737

3838
// Recursively freeze RepeatedField.
39-
VALUE RepeatedField_internal_deep_freeze(VALUE _self);
39+
VALUE RepeatedField_freeze(VALUE _self);
4040

4141
#endif // RUBY_PROTOBUF_REPEATED_FIELD_H_

ruby/lib/google/protobuf/ffi/descriptor.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def options
100100
size_ptr = ::FFI::MemoryPointer.new(:size_t, 1)
101101
temporary_arena = Google::Protobuf::FFI.create_arena
102102
buffer = Google::Protobuf::FFI.message_options(self, size_ptr, temporary_arena)
103-
Google::Protobuf::MessageOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).send(:internal_deep_freeze)
103+
Google::Protobuf::MessageOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).freeze
104104
end
105105
end
106106

@@ -138,7 +138,7 @@ def self.get_message(msg, descriptor, arena)
138138
message = OBJECT_CACHE.get(msg.address)
139139
if message.nil?
140140
message = descriptor.msgclass.send(:private_constructor, arena, msg: msg)
141-
message.send :internal_deep_freeze if frozen?
141+
message.freeze if frozen?
142142
end
143143
message
144144
end

ruby/lib/google/protobuf/ffi/enum_descriptor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def options
8484
size_ptr = ::FFI::MemoryPointer.new(:size_t, 1)
8585
temporary_arena = Google::Protobuf::FFI.create_arena
8686
buffer = Google::Protobuf::FFI.enum_options(self, size_ptr, temporary_arena)
87-
Google::Protobuf::EnumOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).send(:internal_deep_freeze)
87+
Google::Protobuf::EnumOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).freeze
8888
end
8989
end
9090

ruby/lib/google/protobuf/ffi/field_descriptor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ def options
211211
size_ptr = ::FFI::MemoryPointer.new(:size_t, 1)
212212
temporary_arena = Google::Protobuf::FFI.create_arena
213213
buffer = Google::Protobuf::FFI.field_options(self, size_ptr, temporary_arena)
214-
Google::Protobuf::FieldOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).send(:internal_deep_freeze)
214+
Google::Protobuf::FieldOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).freeze
215215
end
216216
end
217217

ruby/lib/google/protobuf/ffi/file_descriptor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def options
5151
size_ptr = ::FFI::MemoryPointer.new(:size_t, 1)
5252
temporary_arena = Google::Protobuf::FFI.create_arena
5353
buffer = Google::Protobuf::FFI.file_options(@file_def, size_ptr, temporary_arena)
54-
Google::Protobuf::FileOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).send(:internal_deep_freeze)
54+
Google::Protobuf::FileOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).freeze
5555
end
5656
end
5757
end

0 commit comments

Comments
 (0)