google-protobuf 3.25.6-aarch64-linux → 4.26.0-aarch64-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of google-protobuf might be problematic. Click here for more details.

Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/convert.c +1 -1
  3. data/ext/google/protobuf_c/defs.c +37 -24
  4. data/ext/google/protobuf_c/extconf.rb +1 -1
  5. data/ext/google/protobuf_c/map.c +10 -17
  6. data/ext/google/protobuf_c/map.h +1 -1
  7. data/ext/google/protobuf_c/message.c +33 -72
  8. data/ext/google/protobuf_c/message.h +1 -1
  9. data/ext/google/protobuf_c/protobuf.c +19 -6
  10. data/ext/google/protobuf_c/repeated_field.c +6 -15
  11. data/ext/google/protobuf_c/repeated_field.h +1 -1
  12. data/ext/google/protobuf_c/ruby-upb.c +11792 -10825
  13. data/ext/google/protobuf_c/ruby-upb.h +5162 -4240
  14. data/ext/google/protobuf_c/shared_convert.c +2 -0
  15. data/ext/google/protobuf_c/shared_message.c +8 -7
  16. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.c +467 -0
  17. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +9 -8
  18. data/lib/google/2.7/protobuf_c.so +0 -0
  19. data/lib/google/3.0/protobuf_c.so +0 -0
  20. data/lib/google/3.1/protobuf_c.so +0 -0
  21. data/lib/google/3.2/protobuf_c.so +0 -0
  22. data/lib/google/3.3/protobuf_c.so +0 -0
  23. data/lib/google/protobuf/any_pb.rb +1 -22
  24. data/lib/google/protobuf/api_pb.rb +1 -24
  25. data/lib/google/protobuf/descriptor_pb.rb +2 -23
  26. data/lib/google/protobuf/duration_pb.rb +1 -22
  27. data/lib/google/protobuf/empty_pb.rb +1 -22
  28. data/lib/google/protobuf/ffi/descriptor.rb +2 -3
  29. data/lib/google/protobuf/ffi/enum_descriptor.rb +1 -1
  30. data/lib/google/protobuf/ffi/ffi.rb +3 -1
  31. data/lib/google/protobuf/ffi/field_descriptor.rb +10 -1
  32. data/lib/google/protobuf/ffi/file_descriptor.rb +1 -13
  33. data/lib/google/protobuf/ffi/internal/convert.rb +7 -23
  34. data/lib/google/protobuf/ffi/map.rb +13 -11
  35. data/lib/google/protobuf/ffi/message.rb +10 -13
  36. data/lib/google/protobuf/ffi/object_cache.rb +3 -3
  37. data/lib/google/protobuf/ffi/oneof_descriptor.rb +1 -1
  38. data/lib/google/protobuf/ffi/repeated_field.rb +12 -10
  39. data/lib/google/protobuf/field_mask_pb.rb +1 -22
  40. data/lib/google/protobuf/internal/object_cache.rb +99 -0
  41. data/lib/google/protobuf/plugin_pb.rb +2 -24
  42. data/lib/google/protobuf/repeated_field.rb +1 -2
  43. data/lib/google/protobuf/source_context_pb.rb +1 -22
  44. data/lib/google/protobuf/struct_pb.rb +1 -22
  45. data/lib/google/protobuf/timestamp_pb.rb +1 -22
  46. data/lib/google/protobuf/type_pb.rb +1 -24
  47. data/lib/google/protobuf/wrappers_pb.rb +1 -22
  48. data/lib/google/protobuf.rb +1 -1
  49. data/lib/google/protobuf_ffi.rb +1 -2
  50. data/lib/google/protobuf_native.rb +0 -1
  51. data/lib/google/tasks/ffi.rake +1 -3
  52. metadata +9 -12
  53. data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -92
  54. data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +0 -157
  55. data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -170
  56. data/lib/google/protobuf/descriptor_dsl.rb +0 -465
  57. data/lib/google/protobuf/object_cache.rb +0 -97
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf4cf60fa35cd93a0a5086e58289ce3101bab06b1e14639fd2eef52fd4202295
4
- data.tar.gz: 99924a425745fc16253af6a2fe67ce9d9a4c9ab636e4b2eee921ece69b249f23
3
+ metadata.gz: 0c95a07c17e610c44087d986345550137d06893bf63ff55de65207777e536439
4
+ data.tar.gz: 5450eb95d00ffef32b65c3586e1790a7b171304b2b4527539b083906630e5efc
5
5
  SHA512:
6
- metadata.gz: 62a70acadc5028ae1e9b3742f3e8d0c3d3cca3e736f3e9a639ed4b832ec07a5294d1d5b808aa9f8139a4ff3ffe294a42ca8a1faa387c6c40481bad3ad93a6ce9
7
- data.tar.gz: df7b44c3012acd9c49f5bed160ce647065b24aec0d498240a4b2ad99747c89b6e361e9dd1149ce17e42a3c4208653fef86d6d51b9000bbd240d5b293763792e0
6
+ metadata.gz: b32d3f8115d327391335460370d41610d49e866ce1fa649cbdaad7b0fbb289b4c87880783c51fd35c5c70bd5d723fe0395b0f5ab22605d2ba7aee00acdda56ee
7
+ data.tar.gz: '058f66852b394ef68bd118a4f03e01d3ef1a013b81d75f2cc40435068fdeeb86a1793a29052f7178cb90bf8114ca1827b11c5339af1650dad5b1ee8718ff87af'
@@ -141,7 +141,7 @@ upb_MessageValue Convert_RubyToUpb(VALUE value, const char* name,
141
141
  VALUE utf8 = rb_enc_from_encoding(rb_utf8_encoding());
142
142
  if (rb_obj_class(value) == rb_cSymbol) {
143
143
  value = rb_funcall(value, rb_intern("to_s"), 0);
144
- } else if (rb_obj_class(value) != rb_cString) {
144
+ } else if (!rb_obj_is_kind_of(value, rb_cString)) {
145
145
  rb_raise(cTypeError,
146
146
  "Invalid argument for string field '%s' (given %s).", name,
147
147
  rb_class2name(CLASS_OF(value)));
@@ -489,7 +489,7 @@ static VALUE FileDescriptor_alloc(VALUE klass) {
489
489
  * call-seq:
490
490
  * FileDescriptor.new => file
491
491
  *
492
- * Returns a new file descriptor. The syntax must be set before it's passed
492
+ * Returns a new file descriptor. May
493
493
  * to a builder.
494
494
  */
495
495
  static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
@@ -519,28 +519,6 @@ static VALUE FileDescriptor_name(VALUE _self) {
519
519
  return name == NULL ? Qnil : rb_str_new2(name);
520
520
  }
521
521
 
522
- /*
523
- * call-seq:
524
- * FileDescriptor.syntax => syntax
525
- *
526
- * Returns this file descriptors syntax.
527
- *
528
- * Valid syntax versions are:
529
- * :proto2 or :proto3.
530
- */
531
- static VALUE FileDescriptor_syntax(VALUE _self) {
532
- FileDescriptor* self = ruby_to_FileDescriptor(_self);
533
-
534
- switch (upb_FileDef_Syntax(self->filedef)) {
535
- case kUpb_Syntax_Proto3:
536
- return ID2SYM(rb_intern("proto3"));
537
- case kUpb_Syntax_Proto2:
538
- return ID2SYM(rb_intern("proto2"));
539
- default:
540
- return Qnil;
541
- }
542
- }
543
-
544
522
  /*
545
523
  * call-seq:
546
524
  * FileDescriptor.options => options
@@ -564,7 +542,6 @@ static void FileDescriptor_register(VALUE module) {
564
542
  rb_define_alloc_func(klass, FileDescriptor_alloc);
565
543
  rb_define_method(klass, "initialize", FileDescriptor_initialize, 3);
566
544
  rb_define_method(klass, "name", FileDescriptor_name, 0);
567
- rb_define_method(klass, "syntax", FileDescriptor_syntax, 0);
568
545
  rb_define_method(klass, "options", FileDescriptor_options, 0);
569
546
  rb_gc_register_address(&cFileDescriptor);
570
547
  cFileDescriptor = klass;
@@ -736,6 +713,28 @@ static VALUE FieldDescriptor_default(VALUE _self) {
736
713
  return Convert_UpbToRuby(default_val, TypeInfo_get(self->fielddef), Qnil);
737
714
  }
738
715
 
716
+ /*
717
+ * call-seq:
718
+ * FieldDescriptor.has_presence? => bool
719
+ *
720
+ * Returns whether this field tracks presence.
721
+ */
722
+ static VALUE FieldDescriptor_has_presence(VALUE _self) {
723
+ FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
724
+ return upb_FieldDef_HasPresence(self->fielddef) ? Qtrue : Qfalse;
725
+ }
726
+
727
+ /*
728
+ * call-seq:
729
+ * FieldDescriptor.is_packed? => bool
730
+ *
731
+ * Returns whether this is a repeated field that uses packed encoding.
732
+ */
733
+ static VALUE FieldDescriptor_is_packed(VALUE _self) {
734
+ FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
735
+ return upb_FieldDef_IsPacked(self->fielddef) ? Qtrue : Qfalse;
736
+ }
737
+
739
738
  /*
740
739
  * call-seq:
741
740
  * FieldDescriptor.json_name => json_name
@@ -943,6 +942,8 @@ static void FieldDescriptor_register(VALUE module) {
943
942
  rb_define_method(klass, "name", FieldDescriptor_name, 0);
944
943
  rb_define_method(klass, "type", FieldDescriptor__type, 0);
945
944
  rb_define_method(klass, "default", FieldDescriptor_default, 0);
945
+ rb_define_method(klass, "has_presence?", FieldDescriptor_has_presence, 0);
946
+ rb_define_method(klass, "is_packed?", FieldDescriptor_is_packed, 0);
946
947
  rb_define_method(klass, "json_name", FieldDescriptor_json_name, 0);
947
948
  rb_define_method(klass, "label", FieldDescriptor_label, 0);
948
949
  rb_define_method(klass, "number", FieldDescriptor_number, 0);
@@ -1163,6 +1164,17 @@ static VALUE EnumDescriptor_file_descriptor(VALUE _self) {
1163
1164
  upb_EnumDef_File(self->enumdef));
1164
1165
  }
1165
1166
 
1167
+ /*
1168
+ * call-seq:
1169
+ * EnumDescriptor.is_closed? => bool
1170
+ *
1171
+ * Returns whether this enum is open or closed.
1172
+ */
1173
+ static VALUE EnumDescriptor_is_closed(VALUE _self) {
1174
+ EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
1175
+ return upb_EnumDef_IsClosed(self->enumdef) ? Qtrue : Qfalse;
1176
+ }
1177
+
1166
1178
  /*
1167
1179
  * call-seq:
1168
1180
  * EnumDescriptor.name => name
@@ -1275,6 +1287,7 @@ static void EnumDescriptor_register(VALUE module) {
1275
1287
  rb_define_method(klass, "each", EnumDescriptor_each, 0);
1276
1288
  rb_define_method(klass, "enummodule", EnumDescriptor_enummodule, 0);
1277
1289
  rb_define_method(klass, "file_descriptor", EnumDescriptor_file_descriptor, 0);
1290
+ rb_define_method(klass, "is_closed?", EnumDescriptor_is_closed, 0);
1278
1291
  rb_define_method(klass, "options", EnumDescriptor_options, 0);
1279
1292
  rb_include_module(klass, rb_mEnumerable);
1280
1293
  rb_gc_register_address(&cEnumDescriptor);
@@ -22,7 +22,7 @@ $INCFLAGS += " -I$(srcdir)/third_party/utf8_range"
22
22
 
23
23
  $srcs = ["protobuf.c", "convert.c", "defs.c", "message.c",
24
24
  "repeated_field.c", "map.c", "ruby-upb.c", "wrap_memcpy.c",
25
- "naive.c", "range2-neon.c", "range2-sse.c", "shared_convert.c",
25
+ "utf8_range.c", "shared_convert.c",
26
26
  "shared_message.c"]
27
27
 
28
28
  create_makefile(ext_name)
@@ -38,9 +38,11 @@ static void Map_mark(void* _self) {
38
38
  rb_gc_mark(self->arena);
39
39
  }
40
40
 
41
+ static size_t Map_memsize(const void* _self) { return sizeof(Map); }
42
+
41
43
  const rb_data_type_t Map_type = {
42
44
  "Google::Protobuf::Map",
43
- {Map_mark, RUBY_DEFAULT_FREE, NULL},
45
+ {Map_mark, RUBY_DEFAULT_FREE, Map_memsize},
44
46
  .flags = RUBY_TYPED_FREE_IMMEDIATELY,
45
47
  };
46
48
 
@@ -444,7 +446,7 @@ static VALUE Map_delete(VALUE _self, VALUE key) {
444
446
  Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
445
447
  upb_MessageValue val_upb;
446
448
 
447
- if (upb_Map_Delete(self->map, key_upb, &val_upb)) {
449
+ if (upb_Map_Delete(Map_GetMutable(_self), key_upb, &val_upb)) {
448
450
  return Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
449
451
  } else {
450
452
  return Qnil;
@@ -563,22 +565,13 @@ VALUE Map_eq(VALUE _self, VALUE _other) {
563
565
  * Freezes the message object. We have to intercept this so we can pin the
564
566
  * Ruby object into memory so we don't forget it's frozen.
565
567
  */
566
- static VALUE Map_freeze(VALUE _self) {
568
+ VALUE Map_freeze(VALUE _self) {
567
569
  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
- }
574
570
 
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);
571
+ if (RB_OBJ_FROZEN(_self)) return _self;
572
+ Arena_Pin(self->arena, _self);
573
+ RB_OBJ_FREEZE(_self);
574
+
582
575
  if (self->value_type_info.type == kUpb_CType_Message) {
583
576
  size_t iter = kUpb_Map_Begin;
584
577
  upb_MessageValue key, val;
@@ -586,7 +579,7 @@ VALUE Map_internal_deep_freeze(VALUE _self) {
586
579
  while (upb_Map_Next(self->map, &key, &val, &iter)) {
587
580
  VALUE val_val =
588
581
  Convert_UpbToRuby(val, self->value_type_info, self->arena);
589
- Message_internal_deep_freeze(val_val);
582
+ Message_freeze(val_val);
590
583
  }
591
584
  }
592
585
  return _self;
@@ -39,6 +39,6 @@ extern VALUE cMap;
39
39
  void Map_register(VALUE module);
40
40
 
41
41
  // Recursively freeze map
42
- VALUE Map_internal_deep_freeze(VALUE _self);
42
+ VALUE Map_freeze(VALUE _self);
43
43
 
44
44
  #endif // RUBY_PROTOBUF_MAP_H_
@@ -44,9 +44,11 @@ static void Message_mark(void* _self) {
44
44
  rb_gc_mark(self->arena);
45
45
  }
46
46
 
47
+ static size_t Message_memsize(const void* _self) { return sizeof(Message); }
48
+
47
49
  static rb_data_type_t Message_type = {
48
50
  "Google::Protobuf::Message",
49
- {Message_mark, RUBY_DEFAULT_FREE, NULL},
51
+ {Message_mark, RUBY_DEFAULT_FREE, Message_memsize},
50
52
  .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
51
53
  };
52
54
 
@@ -661,11 +663,8 @@ static VALUE Message_dup(VALUE _self) {
661
663
  Message* self = ruby_to_Message(_self);
662
664
  VALUE new_msg = rb_class_new_instance(0, NULL, CLASS_OF(_self));
663
665
  Message* new_msg_self = ruby_to_Message(new_msg);
664
- size_t size = upb_MessageDef_MiniTable(self->msgdef)->size;
665
-
666
- // TODO
667
- // TODO
668
- memcpy((upb_Message*)new_msg_self->msg, self->msg, size);
666
+ const upb_MiniTable* m = upb_MessageDef_MiniTable(self->msgdef);
667
+ upb_Message_ShallowCopy((upb_Message*)new_msg_self->msg, self->msg, m);
669
668
  Arena_fuse(self->arena, Arena_get(new_msg_self->arena));
670
669
  return new_msg;
671
670
  }
@@ -769,58 +768,34 @@ static VALUE Message_CreateHash(const upb_Message* msg,
769
768
  if (!msg) return Qnil;
770
769
 
771
770
  VALUE hash = rb_hash_new();
772
- int n = upb_MessageDef_FieldCount(m);
773
- bool is_proto2;
774
-
775
- // We currently have a few behaviors that are specific to proto2.
776
- // This is unfortunate, we should key behaviors off field attributes (like
777
- // whether a field has presence), not proto2 vs. proto3. We should see if we
778
- // can change this without breaking users.
779
- is_proto2 = upb_MessageDef_Syntax(m) == kUpb_Syntax_Proto2;
780
-
781
- for (int i = 0; i < n; i++) {
782
- const upb_FieldDef* field = upb_MessageDef_Field(m, i);
783
- TypeInfo type_info = TypeInfo_get(field);
784
- upb_MessageValue msgval;
785
- VALUE msg_value;
786
- VALUE msg_key;
787
-
788
- if (!is_proto2 && upb_FieldDef_IsSubMessage(field) &&
789
- !upb_FieldDef_IsRepeated(field) &&
790
- !upb_Message_HasFieldByDef(msg, field)) {
791
- // TODO: Legacy behavior, remove when we fix the is_proto2 differences.
792
- msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
793
- rb_hash_aset(hash, msg_key, Qnil);
794
- continue;
795
- }
771
+ size_t iter = kUpb_Message_Begin;
772
+ const upb_DefPool* pool = upb_FileDef_Pool(upb_MessageDef_File(m));
773
+ const upb_FieldDef* field;
774
+ upb_MessageValue val;
796
775
 
797
- // Do not include fields that are not present (oneof or optional fields).
798
- if (is_proto2 && upb_FieldDef_HasPresence(field) &&
799
- !upb_Message_HasFieldByDef(msg, field)) {
776
+ while (upb_Message_Next(msg, m, pool, &field, &val, &iter)) {
777
+ if (upb_FieldDef_IsExtension(field)) {
778
+ // TODO: allow extensions once we have decided what naming scheme the
779
+ // symbol should use. eg. :"[pkg.ext]"
800
780
  continue;
801
781
  }
802
782
 
803
- msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
804
- msgval = upb_Message_GetFieldByDef(msg, field);
805
-
806
- // Proto2 omits empty map/repeated filds also.
783
+ TypeInfo type_info = TypeInfo_get(field);
784
+ VALUE msg_value;
807
785
 
808
786
  if (upb_FieldDef_IsMap(field)) {
809
787
  const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(field);
810
788
  const upb_FieldDef* key_f = upb_MessageDef_FindFieldByNumber(entry_m, 1);
811
789
  const upb_FieldDef* val_f = upb_MessageDef_FindFieldByNumber(entry_m, 2);
812
790
  upb_CType key_type = upb_FieldDef_CType(key_f);
813
- msg_value = Map_CreateHash(msgval.map_val, key_type, TypeInfo_get(val_f));
791
+ msg_value = Map_CreateHash(val.map_val, key_type, TypeInfo_get(val_f));
814
792
  } else if (upb_FieldDef_IsRepeated(field)) {
815
- if (is_proto2 &&
816
- (!msgval.array_val || upb_Array_Size(msgval.array_val) == 0)) {
817
- continue;
818
- }
819
- msg_value = RepeatedField_CreateArray(msgval.array_val, type_info);
793
+ msg_value = RepeatedField_CreateArray(val.array_val, type_info);
820
794
  } else {
821
- msg_value = Scalar_CreateHash(msgval, type_info);
795
+ msg_value = Scalar_CreateHash(val, type_info);
822
796
  }
823
797
 
798
+ VALUE msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
824
799
  rb_hash_aset(hash, msg_key, msg_value);
825
800
  }
826
801
 
@@ -853,22 +828,12 @@ static VALUE Message_to_h(VALUE _self) {
853
828
  * Freezes the message object. We have to intercept this so we can pin the
854
829
  * Ruby object into memory so we don't forget it's frozen.
855
830
  */
856
- static VALUE Message_freeze(VALUE _self) {
831
+ VALUE Message_freeze(VALUE _self) {
857
832
  Message* self = ruby_to_Message(_self);
858
- if (!RB_OBJ_FROZEN(_self)) {
859
- Arena_Pin(self->arena, _self);
860
- RB_OBJ_FREEZE(_self);
861
- }
862
- return _self;
863
- }
864
833
 
865
- /*
866
- * Deep freezes the message object recursively.
867
- * Internal use only.
868
- */
869
- VALUE Message_internal_deep_freeze(VALUE _self) {
870
- Message* self = ruby_to_Message(_self);
871
- Message_freeze(_self);
834
+ if (RB_OBJ_FROZEN(_self)) return _self;
835
+ Arena_Pin(self->arena, _self);
836
+ RB_OBJ_FREEZE(_self);
872
837
 
873
838
  int n = upb_MessageDef_FieldCount(self->msgdef);
874
839
  for (int i = 0; i < n; i++) {
@@ -877,11 +842,11 @@ VALUE Message_internal_deep_freeze(VALUE _self) {
877
842
 
878
843
  if (field != Qnil) {
879
844
  if (upb_FieldDef_IsMap(f)) {
880
- Map_internal_deep_freeze(field);
845
+ Map_freeze(field);
881
846
  } else if (upb_FieldDef_IsRepeated(f)) {
882
- RepeatedField_internal_deep_freeze(field);
847
+ RepeatedField_freeze(field);
883
848
  } else if (upb_FieldDef_IsSubMessage(f)) {
884
- Message_internal_deep_freeze(field);
849
+ Message_freeze(field);
885
850
  }
886
851
  }
887
852
  }
@@ -990,7 +955,7 @@ VALUE Message_decode_bytes(int size, const char* bytes, int options,
990
955
  rb_raise(cParseError, "Error occurred during parsing");
991
956
  }
992
957
  if (freeze) {
993
- Message_internal_deep_freeze(msg_rb);
958
+ Message_freeze(msg_rb);
994
959
  }
995
960
  return msg_rb;
996
961
  }
@@ -1012,9 +977,6 @@ static VALUE Message_decode_json(int argc, VALUE* argv, VALUE klass) {
1012
977
  int options = 0;
1013
978
  upb_Status status;
1014
979
 
1015
- // TODO: use this message's pool instead.
1016
- const upb_DefPool* symtab = DescriptorPool_GetSymtab(generated_pool);
1017
-
1018
980
  if (argc < 1 || argc > 2) {
1019
981
  rb_raise(rb_eArgError, "Expected 1 or 2 arguments.");
1020
982
  }
@@ -1048,8 +1010,9 @@ static VALUE Message_decode_json(int argc, VALUE* argv, VALUE klass) {
1048
1010
  }
1049
1011
 
1050
1012
  upb_Status_Clear(&status);
1013
+ const upb_DefPool* pool = upb_FileDef_Pool(upb_MessageDef_File(msg->msgdef));
1051
1014
  if (!upb_JsonDecode(RSTRING_PTR(data), RSTRING_LEN(data),
1052
- (upb_Message*)msg->msg, msg->msgdef, symtab, options,
1015
+ (upb_Message*)msg->msg, msg->msgdef, pool, options,
1053
1016
  Arena_get(msg->arena), &status)) {
1054
1017
  rb_raise(cParseError, "Error occurred during parsing: %s",
1055
1018
  upb_Status_ErrorMessage(&status));
@@ -1128,9 +1091,6 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
1128
1091
  size_t size;
1129
1092
  upb_Status status;
1130
1093
 
1131
- // TODO: use this message's pool instead.
1132
- const upb_DefPool* symtab = DescriptorPool_GetSymtab(generated_pool);
1133
-
1134
1094
  if (argc < 1 || argc > 2) {
1135
1095
  rb_raise(rb_eArgError, "Expected 1 or 2 arguments.");
1136
1096
  }
@@ -1165,8 +1125,9 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
1165
1125
  }
1166
1126
 
1167
1127
  upb_Status_Clear(&status);
1168
- size = upb_JsonEncode(msg->msg, msg->msgdef, symtab, options, buf,
1169
- sizeof(buf), &status);
1128
+ const upb_DefPool* pool = upb_FileDef_Pool(upb_MessageDef_File(msg->msgdef));
1129
+ size = upb_JsonEncode(msg->msg, msg->msgdef, pool, options, buf, sizeof(buf),
1130
+ &status);
1170
1131
 
1171
1132
  if (!upb_Status_IsOk(&status)) {
1172
1133
  rb_raise(cParseError, "Error occurred during encoding: %s",
@@ -1176,7 +1137,7 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
1176
1137
  VALUE ret;
1177
1138
  if (size >= sizeof(buf)) {
1178
1139
  char* buf2 = malloc(size + 1);
1179
- upb_JsonEncode(msg->msg, msg->msgdef, symtab, options, buf2, size + 1,
1140
+ upb_JsonEncode(msg->msg, msg->msgdef, pool, options, buf2, size + 1,
1180
1141
  &status);
1181
1142
  ret = rb_str_new(buf2, size);
1182
1143
  free(buf2);
@@ -78,7 +78,7 @@ VALUE Message_decode_bytes(int size, const char* bytes, int options,
78
78
  VALUE klass, bool freeze);
79
79
 
80
80
  // Recursively freeze message
81
- VALUE Message_internal_deep_freeze(VALUE _self);
81
+ VALUE Message_freeze(VALUE _self);
82
82
 
83
83
  // Call at startup to register all types in this module.
84
84
  void Message_register(VALUE protobuf);
@@ -164,11 +164,23 @@ static void Arena_free(void *data) {
164
164
  xfree(arena);
165
165
  }
166
166
 
167
+ static size_t Arena_memsize(const void *data) {
168
+ const Arena *arena = data;
169
+ size_t fused_count;
170
+ size_t memsize = upb_Arena_SpaceAllocated(arena->arena, &fused_count);
171
+ if (fused_count > 1) {
172
+ // If other arena were fused we attribute an equal
173
+ // share of memory usage to each one.
174
+ memsize /= fused_count;
175
+ }
176
+ return memsize + sizeof(Arena);
177
+ }
178
+
167
179
  static VALUE cArena;
168
180
 
169
181
  const rb_data_type_t Arena_type = {
170
182
  "Google::Protobuf::Internal::Arena",
171
- {Arena_mark, Arena_free, NULL},
183
+ {Arena_mark, Arena_free, Arena_memsize},
172
184
  .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
173
185
  };
174
186
 
@@ -241,16 +253,17 @@ static void ObjectCache_Init(VALUE protobuf) {
241
253
  item_try_add = rb_intern("try_add");
242
254
 
243
255
  rb_gc_register_address(&weak_obj_cache);
256
+ VALUE internal = rb_const_get(protobuf, rb_intern("Internal"));
244
257
  #if SIZEOF_LONG >= SIZEOF_VALUE
245
- VALUE cache_class = rb_const_get(protobuf, rb_intern("ObjectCache"));
258
+ VALUE cache_class = rb_const_get(internal, rb_intern("ObjectCache"));
246
259
  #else
247
- VALUE cache_class = rb_const_get(protobuf, rb_intern("LegacyObjectCache"));
260
+ VALUE cache_class = rb_const_get(internal, rb_intern("LegacyObjectCache"));
248
261
  #endif
249
262
 
250
263
  weak_obj_cache = rb_class_new_instance(0, NULL, cache_class);
251
- rb_const_set(protobuf, rb_intern("OBJECT_CACHE"), weak_obj_cache);
252
- rb_const_set(protobuf, rb_intern("SIZEOF_LONG"), INT2NUM(SIZEOF_LONG));
253
- rb_const_set(protobuf, rb_intern("SIZEOF_VALUE"), INT2NUM(SIZEOF_VALUE));
264
+ rb_const_set(internal, rb_intern("OBJECT_CACHE"), weak_obj_cache);
265
+ rb_const_set(internal, rb_intern("SIZEOF_LONG"), INT2NUM(SIZEOF_LONG));
266
+ rb_const_set(internal, rb_intern("SIZEOF_VALUE"), INT2NUM(SIZEOF_VALUE));
254
267
  }
255
268
 
256
269
  static VALUE ObjectCache_GetKey(const void *key) {
@@ -478,29 +478,20 @@ VALUE RepeatedField_eq(VALUE _self, VALUE _other) {
478
478
  * Freezes the repeated field. We have to intercept this so we can pin the Ruby
479
479
  * object into memory so we don't forget it's frozen.
480
480
  */
481
- static VALUE RepeatedField_freeze(VALUE _self) {
481
+ VALUE RepeatedField_freeze(VALUE _self) {
482
482
  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
- }
489
483
 
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
+
497
488
  if (self->type_info.type == kUpb_CType_Message) {
498
489
  int size = upb_Array_Size(self->array);
499
490
  int i;
500
491
  for (i = 0; i < size; i++) {
501
492
  upb_MessageValue msgval = upb_Array_Get(self->array, i);
502
493
  VALUE val = Convert_UpbToRuby(msgval, self->type_info, self->arena);
503
- Message_internal_deep_freeze(val);
494
+ Message_freeze(val);
504
495
  }
505
496
  }
506
497
  return _self;
@@ -36,6 +36,6 @@ extern VALUE cRepeatedField;
36
36
  void RepeatedField_register(VALUE module);
37
37
 
38
38
  // Recursively freeze RepeatedField.
39
- VALUE RepeatedField_internal_deep_freeze(VALUE _self);
39
+ VALUE RepeatedField_freeze(VALUE _self);
40
40
 
41
41
  #endif // RUBY_PROTOBUF_REPEATED_FIELD_H_