Skip to content

Commit 16cc9e3

Browse files
committed
Simplify deep freeze logic.
1 parent 34b0dea commit 16cc9e3

9 files changed

Lines changed: 60 additions & 86 deletions

File tree

ruby/ext/google/protobuf_c/map.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -578,21 +578,16 @@ static VALUE Map_freeze(VALUE _self) {
578578
*/
579579
VALUE Map_internal_deep_freeze(VALUE _self) {
580580
Map* self = ruby_to_Map(_self);
581+
Map_freeze(_self);
582+
if (self->value_type_info.type == kUpb_CType_Message) {
583+
size_t iter = kUpb_Map_Begin;
584+
upb_MessageValue key, val;
581585

582-
if (!RB_OBJ_FROZEN(_self)) {
583-
Map_freeze(_self);
584-
585-
if (self->value_type_info.type == kUpb_CType_Message) {
586-
size_t iter = kUpb_Map_Begin;
587-
upb_MessageValue key, val;
588-
589-
while (upb_Map_Next(self->map, &key, &val, &iter)) {
590-
VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
591-
Message_internal_deep_freeze(val_val);
592-
}
586+
while (upb_Map_Next(self->map, &key, &val, &iter)) {
587+
VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
588+
Message_internal_deep_freeze(val_val);
593589
}
594590
}
595-
596591
return _self;
597592
}
598593

ruby/ext/google/protobuf_c/message.c

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -865,26 +865,23 @@ static VALUE Message_freeze(VALUE _self) {
865865
*/
866866
VALUE Message_internal_deep_freeze(VALUE _self) {
867867
Message* self = ruby_to_Message(_self);
868-
if (!RB_OBJ_FROZEN(_self)) {
869-
Message_freeze(_self);
870-
871-
int n = upb_MessageDef_FieldCount(self->msgdef);
872-
for (int i = 0; i < n; i++) {
873-
const upb_FieldDef* f = upb_MessageDef_Field(self->msgdef, i);
874-
VALUE field = Message_getfield(_self, f);
875-
876-
if (field != Qnil) {
877-
if (upb_FieldDef_IsMap(f)) {
878-
Map_internal_deep_freeze(field);
879-
} else if (upb_FieldDef_IsRepeated(f)) {
880-
RepeatedField_internal_deep_freeze(field);
881-
} else if (upb_FieldDef_IsSubMessage(f)) {
882-
Message_internal_deep_freeze(field);
883-
}
868+
Message_freeze(_self);
869+
870+
int n = upb_MessageDef_FieldCount(self->msgdef);
871+
for (int i = 0; i < n; i++) {
872+
const upb_FieldDef* f = upb_MessageDef_Field(self->msgdef, i);
873+
VALUE field = Message_getfield(_self, f);
874+
875+
if (field != Qnil) {
876+
if (upb_FieldDef_IsMap(f)) {
877+
Map_internal_deep_freeze(field);
878+
} else if (upb_FieldDef_IsRepeated(f)) {
879+
RepeatedField_internal_deep_freeze(field);
880+
} else if (upb_FieldDef_IsSubMessage(f)) {
881+
Message_internal_deep_freeze(field);
884882
}
885883
}
886884
}
887-
888885
return _self;
889886
}
890887

ruby/ext/google/protobuf_c/repeated_field.c

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -493,22 +493,16 @@ static VALUE RepeatedField_freeze(VALUE _self) {
493493
*/
494494
VALUE RepeatedField_internal_deep_freeze(VALUE _self) {
495495
RepeatedField* self = ruby_to_RepeatedField(_self);
496-
497-
if (!RB_OBJ_FROZEN(_self)) {
498-
RepeatedField_freeze(_self);
499-
500-
if (self->type_info.type == kUpb_CType_Message) {
501-
int size = upb_Array_Size(self->array);
502-
int i;
503-
504-
for (i = 0; i < size; i++) {
505-
upb_MessageValue msgval = upb_Array_Get(self->array, i);
506-
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
507-
Message_internal_deep_freeze(val);
508-
}
496+
RepeatedField_freeze(_self);
497+
if (self->type_info.type == kUpb_CType_Message) {
498+
int size = upb_Array_Size(self->array);
499+
int i;
500+
for (i = 0; i < size; i++) {
501+
upb_MessageValue msgval = upb_Array_Get(self->array, i);
502+
VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
503+
Message_internal_deep_freeze(val);
509504
}
510505
}
511-
512506
return _self;
513507
}
514508

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,11 @@ def each &block
270270
include Google::Protobuf::Internal::Convert
271271

272272
def internal_deep_freeze
273-
unless frozen?
274-
freeze
275-
if value_type == :message
276-
internal_iterator do |iterator|
277-
value_message_value = Google::Protobuf::FFI.map_value(@map_ptr, iterator)
278-
convert_upb_to_ruby(value_message_value, value_type, descriptor, arena).send :internal_deep_freeze
279-
end
273+
freeze
274+
if value_type == :message
275+
internal_iterator do |iterator|
276+
value_message_value = Google::Protobuf::FFI.map_value(@map_ptr, iterator)
277+
convert_upb_to_ruby(value_message_value, value_type, descriptor, arena).send :internal_deep_freeze
280278
end
281279
end
282280
self

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,11 @@ def self.encode_json(message, options = {})
294294
include Google::Protobuf::Internal::Convert
295295

296296
def internal_deep_freeze
297-
unless frozen?
298-
freeze
299-
self.class.descriptor.each do |field_descriptor|
300-
next if field_descriptor.has_presence? && !Google::Protobuf::FFI.get_message_has(@msg, field_descriptor)
301-
if field_descriptor.map? or field_descriptor.repeated? or field_descriptor.sub_message?
302-
get_field(field_descriptor).send :internal_deep_freeze
303-
end
297+
freeze
298+
self.class.descriptor.each do |field_descriptor|
299+
next if field_descriptor.has_presence? && !Google::Protobuf::FFI.get_message_has(@msg, field_descriptor)
300+
if field_descriptor.map? or field_descriptor.repeated? or field_descriptor.sub_message?
301+
get_field(field_descriptor).send :internal_deep_freeze
304302
end
305303
end
306304
self

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,10 @@ def concat(other)
253253
attr :name, :arena, :array, :type, :descriptor
254254

255255
def internal_deep_freeze
256-
unless frozen?
257-
freeze
258-
if type == :message
259-
each do |element|
260-
element.send :internal_deep_freeze
261-
end
256+
freeze
257+
if type == :message
258+
each do |element|
259+
element.send :internal_deep_freeze
262260
end
263261
end
264262
self

ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -373,12 +373,10 @@ public RubyHash toHash(ThreadContext context) {
373373
}
374374

375375
protected IRubyObject deepFreeze(ThreadContext context) {
376-
if (!isFrozen()) {
377-
setFrozen(true);
378-
if (valueType == FieldDescriptor.Type.MESSAGE) {
379-
for (IRubyObject key : table.keySet()) {
380-
((RubyMessage)table.get(key)).deepFreeze(context);
381-
}
376+
setFrozen(true);
377+
if (valueType == FieldDescriptor.Type.MESSAGE) {
378+
for (IRubyObject key : table.keySet()) {
379+
((RubyMessage)table.get(key)).deepFreeze(context);
382380
}
383381
}
384382
return this;

ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -817,17 +817,15 @@ public IRubyObject toHash(ThreadContext context) {
817817
}
818818

819819
protected IRubyObject deepFreeze(ThreadContext context) {
820-
if (!isFrozen()) {
821-
setFrozen(true);
822-
for (FieldDescriptor fdef : descriptor.getFields()) {
823-
if (fdef.isMapField()) {
824-
((RubyMap) fields.get(fdef)).deepFreeze(context);
825-
} else if (fdef.isRepeated()) {
826-
this.getRepeatedField(context, fdef).deepFreeze(context);
827-
} else if (fields.containsKey(fdef)) {
828-
if (fdef.getType() == FieldDescriptor.Type.MESSAGE) {
829-
((RubyMessage) fields.get(fdef)).deepFreeze(context);
830-
}
820+
setFrozen(true);
821+
for (FieldDescriptor fdef : descriptor.getFields()) {
822+
if (fdef.isMapField()) {
823+
((RubyMap) fields.get(fdef)).deepFreeze(context);
824+
} else if (fdef.isRepeated()) {
825+
this.getRepeatedField(context, fdef).deepFreeze(context);
826+
} else if (fields.containsKey(fdef)) {
827+
if (fdef.getType() == FieldDescriptor.Type.MESSAGE) {
828+
((RubyMessage) fields.get(fdef)).deepFreeze(context);
831829
}
832830
}
833831
}

ruby/src/main/java/com/google/protobuf/jruby/RubyRepeatedField.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -359,12 +359,10 @@ public IRubyObject inspect() {
359359
}
360360

361361
protected IRubyObject deepFreeze(ThreadContext context) {
362-
if (!isFrozen()) {
363-
setFrozen(true);
364-
if (fieldType == FieldDescriptor.Type.MESSAGE) {
365-
for (int i = 0; i < size(); i++) {
366-
((RubyMessage)storage.eltInternal(i)).deepFreeze(context);
367-
}
362+
setFrozen(true);
363+
if (fieldType == FieldDescriptor.Type.MESSAGE) {
364+
for (int i = 0; i < size(); i++) {
365+
((RubyMessage)storage.eltInternal(i)).deepFreeze(context);
368366
}
369367
}
370368
return this;

0 commit comments

Comments
 (0)