google-protobuf 3.25.3-java → 4.26.0-java

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/message.c +41 -77
  3. data/ext/google/protobuf_c/message.h +1 -1
  4. data/ext/google/protobuf_c/protobuf.c +19 -6
  5. data/ext/google/protobuf_c/ruby-upb.c +11788 -10795
  6. data/ext/google/protobuf_c/ruby-upb.h +5164 -4242
  7. data/ext/google/protobuf_c/shared_convert.c +5 -3
  8. data/ext/google/protobuf_c/shared_convert.h +2 -2
  9. data/ext/google/protobuf_c/shared_message.c +8 -6
  10. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.c +467 -0
  11. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +9 -8
  12. data/lib/google/protobuf/any_pb.rb +1 -22
  13. data/lib/google/protobuf/api_pb.rb +1 -24
  14. data/lib/google/protobuf/descriptor_pb.rb +2 -23
  15. data/lib/google/protobuf/duration_pb.rb +1 -22
  16. data/lib/google/protobuf/empty_pb.rb +1 -22
  17. data/lib/google/protobuf/ffi/descriptor.rb +2 -3
  18. data/lib/google/protobuf/ffi/enum_descriptor.rb +1 -1
  19. data/lib/google/protobuf/ffi/ffi.rb +3 -1
  20. data/lib/google/protobuf/ffi/field_descriptor.rb +10 -1
  21. data/lib/google/protobuf/ffi/file_descriptor.rb +1 -13
  22. data/lib/google/protobuf/ffi/internal/convert.rb +7 -23
  23. data/lib/google/protobuf/ffi/map.rb +13 -11
  24. data/lib/google/protobuf/ffi/message.rb +10 -13
  25. data/lib/google/protobuf/ffi/object_cache.rb +3 -3
  26. data/lib/google/protobuf/ffi/oneof_descriptor.rb +1 -1
  27. data/lib/google/protobuf/ffi/repeated_field.rb +12 -10
  28. data/lib/google/protobuf/field_mask_pb.rb +1 -22
  29. data/lib/google/protobuf/internal/object_cache.rb +99 -0
  30. data/lib/google/protobuf/plugin_pb.rb +2 -24
  31. data/lib/google/protobuf/repeated_field.rb +1 -2
  32. data/lib/google/protobuf/source_context_pb.rb +1 -22
  33. data/lib/google/protobuf/struct_pb.rb +1 -22
  34. data/lib/google/protobuf/timestamp_pb.rb +1 -22
  35. data/lib/google/protobuf/type_pb.rb +1 -24
  36. data/lib/google/protobuf/wrappers_pb.rb +1 -22
  37. data/lib/google/protobuf.rb +1 -1
  38. data/lib/google/protobuf_ffi.rb +1 -2
  39. data/lib/google/protobuf_java.jar +0 -0
  40. data/lib/google/protobuf_native.rb +0 -1
  41. data/lib/google/tasks/ffi.rake +1 -3
  42. metadata +8 -11
  43. data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -92
  44. data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +0 -157
  45. data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -170
  46. data/lib/google/protobuf/descriptor_dsl.rb +0 -465
  47. data/lib/google/protobuf/object_cache.rb +0 -97
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2f0af295a19a12bd758b43115008fa428155f1189e7a062910c45d08891c0dd
4
- data.tar.gz: e8f1e3d0ea4ac631b3170dd2653ca8a342401a654370c03da9184fed47c2fbc1
3
+ metadata.gz: 44727ad9cc1321fcc3b3c2972e81203a02e71aaa3cac276c59d611b7c82fd854
4
+ data.tar.gz: 3792a43a19d66ed1e2cd0b8fba5c96423468b85a2b0c3a121d2a82a36537399f
5
5
  SHA512:
6
- metadata.gz: a69324ea72886ac3b800b30fbbc2690d4d9b9c631f3f6f544b7399baa09b5f4a219776f53e489d985f3b48fef9025f7967cd3ec80947979ff42a57dce11b872f
7
- data.tar.gz: 0550cd072197dc1b46234a4c6a0377499f8044cdfc873da5d8af61efce60f0b0b18523d9a8be9991048a5a5baa7955d4759513c7a14e90a0e54e3c9753ce727d
6
+ metadata.gz: 5ad3375cea93abb128d052c328962de00341a87db926db8b94701059d01f0a36e444633caca126399fc1866a9f31bdb0b15fabbb702a6f3945c1195db1893e34
7
+ data.tar.gz: cf09131f3248c7c1886725c7bdabe9af23857933bd0792861781d720a976d107a70bdbe81cab105a88c73802f240d7fbbeb00d307b2c35d991bbadcc38435a00
@@ -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
 
@@ -488,7 +490,8 @@ static int Map_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
488
490
  k = Convert_RubyToUpb(key, "", map_init->key_type, NULL);
489
491
 
490
492
  if (map_init->val_type.type == kUpb_CType_Message && TYPE(val) == T_HASH) {
491
- upb_MiniTable* t = upb_MessageDef_MiniTable(map_init->val_type.def.msgdef);
493
+ const upb_MiniTable* t =
494
+ upb_MessageDef_MiniTable(map_init->val_type.def.msgdef);
492
495
  upb_Message* msg = upb_Message_New(t, map_init->arena);
493
496
  Message_InitFromValue(msg, map_init->val_type.def.msgdef, val,
494
497
  map_init->arena);
@@ -519,7 +522,7 @@ static upb_MessageValue MessageValue_FromValue(VALUE val, TypeInfo info,
519
522
  upb_Arena* arena) {
520
523
  if (info.type == kUpb_CType_Message) {
521
524
  upb_MessageValue msgval;
522
- upb_MiniTable* t = upb_MessageDef_MiniTable(info.def.msgdef);
525
+ const upb_MiniTable* t = upb_MessageDef_MiniTable(info.def.msgdef);
523
526
  upb_Message* msg = upb_Message_New(t, arena);
524
527
  Message_InitFromValue(msg, info.def.msgdef, val, arena);
525
528
  msgval.msg_val = msg;
@@ -635,7 +638,7 @@ static VALUE Message_initialize(int argc, VALUE* argv, VALUE _self) {
635
638
  Message* self = ruby_to_Message(_self);
636
639
  VALUE arena_rb = Arena_new();
637
640
  upb_Arena* arena = Arena_get(arena_rb);
638
- upb_MiniTable* t = upb_MessageDef_MiniTable(self->msgdef);
641
+ const upb_MiniTable* t = upb_MessageDef_MiniTable(self->msgdef);
639
642
  upb_Message* msg = upb_Message_New(t, arena);
640
643
 
641
644
  Message_InitPtr(_self, msg, arena_rb);
@@ -660,11 +663,8 @@ static VALUE Message_dup(VALUE _self) {
660
663
  Message* self = ruby_to_Message(_self);
661
664
  VALUE new_msg = rb_class_new_instance(0, NULL, CLASS_OF(_self));
662
665
  Message* new_msg_self = ruby_to_Message(new_msg);
663
- size_t size = upb_MessageDef_MiniTable(self->msgdef)->size;
664
-
665
- // TODO
666
- // TODO
667
- 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);
668
668
  Arena_fuse(self->arena, Arena_get(new_msg_self->arena));
669
669
  return new_msg;
670
670
  }
@@ -678,7 +678,8 @@ bool Message_Equal(const upb_Message* m1, const upb_Message* m2,
678
678
  if (upb_Status_IsOk(&status)) {
679
679
  return return_value;
680
680
  } else {
681
- rb_raise(cParseError, upb_Status_ErrorMessage(&status));
681
+ rb_raise(cParseError, "Message_Equal(): %s",
682
+ upb_Status_ErrorMessage(&status));
682
683
  }
683
684
  }
684
685
 
@@ -709,7 +710,8 @@ uint64_t Message_Hash(const upb_Message* msg, const upb_MessageDef* m,
709
710
  if (upb_Status_IsOk(&status)) {
710
711
  return return_value;
711
712
  } else {
712
- rb_raise(cParseError, upb_Status_ErrorMessage(&status));
713
+ rb_raise(cParseError, "Message_Hash(): %s",
714
+ upb_Status_ErrorMessage(&status));
713
715
  }
714
716
  }
715
717
 
@@ -766,58 +768,34 @@ static VALUE Message_CreateHash(const upb_Message* msg,
766
768
  if (!msg) return Qnil;
767
769
 
768
770
  VALUE hash = rb_hash_new();
769
- int n = upb_MessageDef_FieldCount(m);
770
- bool is_proto2;
771
-
772
- // We currently have a few behaviors that are specific to proto2.
773
- // This is unfortunate, we should key behaviors off field attributes (like
774
- // whether a field has presence), not proto2 vs. proto3. We should see if we
775
- // can change this without breaking users.
776
- is_proto2 = upb_MessageDef_Syntax(m) == kUpb_Syntax_Proto2;
777
-
778
- for (int i = 0; i < n; i++) {
779
- const upb_FieldDef* field = upb_MessageDef_Field(m, i);
780
- TypeInfo type_info = TypeInfo_get(field);
781
- upb_MessageValue msgval;
782
- VALUE msg_value;
783
- VALUE msg_key;
784
-
785
- if (!is_proto2 && upb_FieldDef_IsSubMessage(field) &&
786
- !upb_FieldDef_IsRepeated(field) &&
787
- !upb_Message_HasFieldByDef(msg, field)) {
788
- // TODO: Legacy behavior, remove when we fix the is_proto2 differences.
789
- msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
790
- rb_hash_aset(hash, msg_key, Qnil);
791
- continue;
792
- }
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;
793
775
 
794
- // Do not include fields that are not present (oneof or optional fields).
795
- if (is_proto2 && upb_FieldDef_HasPresence(field) &&
796
- !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]"
797
780
  continue;
798
781
  }
799
782
 
800
- msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
801
- msgval = upb_Message_GetFieldByDef(msg, field);
802
-
803
- // Proto2 omits empty map/repeated filds also.
783
+ TypeInfo type_info = TypeInfo_get(field);
784
+ VALUE msg_value;
804
785
 
805
786
  if (upb_FieldDef_IsMap(field)) {
806
787
  const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(field);
807
788
  const upb_FieldDef* key_f = upb_MessageDef_FindFieldByNumber(entry_m, 1);
808
789
  const upb_FieldDef* val_f = upb_MessageDef_FindFieldByNumber(entry_m, 2);
809
790
  upb_CType key_type = upb_FieldDef_CType(key_f);
810
- 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));
811
792
  } else if (upb_FieldDef_IsRepeated(field)) {
812
- if (is_proto2 &&
813
- (!msgval.array_val || upb_Array_Size(msgval.array_val) == 0)) {
814
- continue;
815
- }
816
- msg_value = RepeatedField_CreateArray(msgval.array_val, type_info);
793
+ msg_value = RepeatedField_CreateArray(val.array_val, type_info);
817
794
  } else {
818
- msg_value = Scalar_CreateHash(msgval, type_info);
795
+ msg_value = Scalar_CreateHash(val, type_info);
819
796
  }
820
797
 
798
+ VALUE msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
821
799
  rb_hash_aset(hash, msg_key, msg_value);
822
800
  }
823
801
 
@@ -850,22 +828,12 @@ static VALUE Message_to_h(VALUE _self) {
850
828
  * Freezes the message object. We have to intercept this so we can pin the
851
829
  * Ruby object into memory so we don't forget it's frozen.
852
830
  */
853
- static VALUE Message_freeze(VALUE _self) {
831
+ VALUE Message_freeze(VALUE _self) {
854
832
  Message* self = ruby_to_Message(_self);
855
- if (!RB_OBJ_FROZEN(_self)) {
856
- Arena_Pin(self->arena, _self);
857
- RB_OBJ_FREEZE(_self);
858
- }
859
- return _self;
860
- }
861
833
 
862
- /*
863
- * Deep freezes the message object recursively.
864
- * Internal use only.
865
- */
866
- VALUE Message_internal_deep_freeze(VALUE _self) {
867
- Message* self = ruby_to_Message(_self);
868
- Message_freeze(_self);
834
+ if (RB_OBJ_FROZEN(_self)) return _self;
835
+ Arena_Pin(self->arena, _self);
836
+ RB_OBJ_FREEZE(_self);
869
837
 
870
838
  int n = upb_MessageDef_FieldCount(self->msgdef);
871
839
  for (int i = 0; i < n; i++) {
@@ -874,11 +842,11 @@ VALUE Message_internal_deep_freeze(VALUE _self) {
874
842
 
875
843
  if (field != Qnil) {
876
844
  if (upb_FieldDef_IsMap(f)) {
877
- Map_internal_deep_freeze(field);
845
+ Map_freeze(field);
878
846
  } else if (upb_FieldDef_IsRepeated(f)) {
879
- RepeatedField_internal_deep_freeze(field);
847
+ RepeatedField_freeze(field);
880
848
  } else if (upb_FieldDef_IsSubMessage(f)) {
881
- Message_internal_deep_freeze(field);
849
+ Message_freeze(field);
882
850
  }
883
851
  }
884
852
  }
@@ -987,7 +955,7 @@ VALUE Message_decode_bytes(int size, const char* bytes, int options,
987
955
  rb_raise(cParseError, "Error occurred during parsing");
988
956
  }
989
957
  if (freeze) {
990
- Message_internal_deep_freeze(msg_rb);
958
+ Message_freeze(msg_rb);
991
959
  }
992
960
  return msg_rb;
993
961
  }
@@ -1009,9 +977,6 @@ static VALUE Message_decode_json(int argc, VALUE* argv, VALUE klass) {
1009
977
  int options = 0;
1010
978
  upb_Status status;
1011
979
 
1012
- // TODO: use this message's pool instead.
1013
- const upb_DefPool* symtab = DescriptorPool_GetSymtab(generated_pool);
1014
-
1015
980
  if (argc < 1 || argc > 2) {
1016
981
  rb_raise(rb_eArgError, "Expected 1 or 2 arguments.");
1017
982
  }
@@ -1045,8 +1010,9 @@ static VALUE Message_decode_json(int argc, VALUE* argv, VALUE klass) {
1045
1010
  }
1046
1011
 
1047
1012
  upb_Status_Clear(&status);
1013
+ const upb_DefPool* pool = upb_FileDef_Pool(upb_MessageDef_File(msg->msgdef));
1048
1014
  if (!upb_JsonDecode(RSTRING_PTR(data), RSTRING_LEN(data),
1049
- (upb_Message*)msg->msg, msg->msgdef, symtab, options,
1015
+ (upb_Message*)msg->msg, msg->msgdef, pool, options,
1050
1016
  Arena_get(msg->arena), &status)) {
1051
1017
  rb_raise(cParseError, "Error occurred during parsing: %s",
1052
1018
  upb_Status_ErrorMessage(&status));
@@ -1125,9 +1091,6 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
1125
1091
  size_t size;
1126
1092
  upb_Status status;
1127
1093
 
1128
- // TODO: use this message's pool instead.
1129
- const upb_DefPool* symtab = DescriptorPool_GetSymtab(generated_pool);
1130
-
1131
1094
  if (argc < 1 || argc > 2) {
1132
1095
  rb_raise(rb_eArgError, "Expected 1 or 2 arguments.");
1133
1096
  }
@@ -1162,8 +1125,9 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
1162
1125
  }
1163
1126
 
1164
1127
  upb_Status_Clear(&status);
1165
- size = upb_JsonEncode(msg->msg, msg->msgdef, symtab, options, buf,
1166
- 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);
1167
1131
 
1168
1132
  if (!upb_Status_IsOk(&status)) {
1169
1133
  rb_raise(cParseError, "Error occurred during encoding: %s",
@@ -1173,7 +1137,7 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
1173
1137
  VALUE ret;
1174
1138
  if (size >= sizeof(buf)) {
1175
1139
  char* buf2 = malloc(size + 1);
1176
- upb_JsonEncode(msg->msg, msg->msgdef, symtab, options, buf2, size + 1,
1140
+ upb_JsonEncode(msg->msg, msg->msgdef, pool, options, buf2, size + 1,
1177
1141
  &status);
1178
1142
  ret = rb_str_new(buf2, size);
1179
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) {