google-protobuf 3.21.6 → 3.25.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/Rakefile +3 -0
  3. data/ext/google/protobuf_c/convert.c +23 -70
  4. data/ext/google/protobuf_c/convert.h +3 -28
  5. data/ext/google/protobuf_c/defs.c +178 -55
  6. data/ext/google/protobuf_c/defs.h +3 -28
  7. data/ext/google/protobuf_c/extconf.rb +4 -4
  8. data/ext/google/protobuf_c/glue.c +56 -0
  9. data/ext/google/protobuf_c/map.c +54 -70
  10. data/ext/google/protobuf_c/map.h +6 -28
  11. data/ext/google/protobuf_c/message.c +186 -162
  12. data/ext/google/protobuf_c/message.h +10 -28
  13. data/ext/google/protobuf_c/protobuf.c +39 -176
  14. data/ext/google/protobuf_c/protobuf.h +24 -32
  15. data/ext/google/protobuf_c/repeated_field.c +28 -29
  16. data/ext/google/protobuf_c/repeated_field.h +6 -28
  17. data/ext/google/protobuf_c/ruby-upb.c +12326 -9027
  18. data/ext/google/protobuf_c/ruby-upb.h +11950 -4518
  19. data/ext/google/protobuf_c/shared_convert.c +64 -0
  20. data/ext/google/protobuf_c/shared_convert.h +26 -0
  21. data/ext/google/protobuf_c/shared_message.c +65 -0
  22. data/ext/google/protobuf_c/shared_message.h +25 -0
  23. data/ext/google/protobuf_c/third_party/utf8_range/LICENSE +1 -0
  24. data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -0
  25. data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +1 -1
  26. data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -0
  27. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +13 -1
  28. data/ext/google/protobuf_c/wrap_memcpy.c +3 -26
  29. data/lib/google/protobuf/any_pb.rb +24 -5
  30. data/lib/google/protobuf/api_pb.rb +26 -23
  31. data/lib/google/protobuf/descriptor_dsl.rb +0 -0
  32. data/lib/google/protobuf/descriptor_pb.rb +43 -226
  33. data/lib/google/protobuf/duration_pb.rb +24 -5
  34. data/lib/google/protobuf/empty_pb.rb +24 -3
  35. data/lib/google/protobuf/ffi/descriptor.rb +165 -0
  36. data/lib/google/protobuf/ffi/descriptor_pool.rb +75 -0
  37. data/lib/google/protobuf/ffi/enum_descriptor.rb +171 -0
  38. data/lib/google/protobuf/ffi/ffi.rb +213 -0
  39. data/lib/google/protobuf/ffi/field_descriptor.rb +319 -0
  40. data/lib/google/protobuf/ffi/file_descriptor.rb +59 -0
  41. data/lib/google/protobuf/ffi/internal/arena.rb +66 -0
  42. data/lib/google/protobuf/ffi/internal/convert.rb +305 -0
  43. data/lib/google/protobuf/ffi/internal/pointer_helper.rb +35 -0
  44. data/lib/google/protobuf/ffi/internal/type_safety.rb +25 -0
  45. data/lib/google/protobuf/ffi/map.rb +407 -0
  46. data/lib/google/protobuf/ffi/message.rb +662 -0
  47. data/lib/google/protobuf/ffi/object_cache.rb +30 -0
  48. data/lib/google/protobuf/ffi/oneof_descriptor.rb +95 -0
  49. data/lib/google/protobuf/ffi/repeated_field.rb +383 -0
  50. data/lib/google/protobuf/field_mask_pb.rb +24 -4
  51. data/lib/google/protobuf/message_exts.rb +8 -26
  52. data/lib/google/protobuf/object_cache.rb +97 -0
  53. data/lib/google/protobuf/plugin_pb.rb +47 -0
  54. data/lib/google/protobuf/repeated_field.rb +3 -26
  55. data/lib/google/protobuf/source_context_pb.rb +24 -4
  56. data/lib/google/protobuf/struct_pb.rb +24 -20
  57. data/lib/google/protobuf/timestamp_pb.rb +24 -5
  58. data/lib/google/protobuf/type_pb.rb +26 -68
  59. data/lib/google/protobuf/well_known_types.rb +5 -34
  60. data/lib/google/protobuf/wrappers_pb.rb +24 -28
  61. data/lib/google/protobuf.rb +27 -45
  62. data/lib/google/protobuf_ffi.rb +50 -0
  63. data/lib/google/protobuf_native.rb +20 -0
  64. data/lib/google/tasks/ffi.rake +102 -0
  65. metadata +75 -12
  66. data/tests/basic.rb +0 -739
  67. data/tests/generated_code_test.rb +0 -23
  68. data/tests/stress.rb +0 -38
@@ -1,32 +1,9 @@
1
1
  // Protocol Buffers - Google's data interchange format
2
2
  // Copyright 2014 Google Inc. All rights reserved.
3
- // https://developers.google.com/protocol-buffers/
4
3
  //
5
- // Redistribution and use in source and binary forms, with or without
6
- // modification, are permitted provided that the following conditions are
7
- // met:
8
- //
9
- // * Redistributions of source code must retain the above copyright
10
- // notice, this list of conditions and the following disclaimer.
11
- // * Redistributions in binary form must reproduce the above
12
- // copyright notice, this list of conditions and the following disclaimer
13
- // in the documentation and/or other materials provided with the
14
- // distribution.
15
- // * Neither the name of Google Inc. nor the names of its
16
- // contributors may be used to endorse or promote products derived from
17
- // this software without specific prior written permission.
18
- //
19
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4
+ // Use of this source code is governed by a BSD-style
5
+ // license that can be found in the LICENSE file or at
6
+ // https://developers.google.com/open-source/licenses/bsd
30
7
 
31
8
  #include "convert.h"
32
9
  #include "defs.h"
@@ -93,7 +70,6 @@ VALUE Map_GetRubyWrapper(upb_Map* map, upb_CType key_type, TypeInfo value_type,
93
70
  if (val == Qnil) {
94
71
  val = Map_alloc(cMap);
95
72
  Map* self;
96
- ObjectCache_Add(map, val);
97
73
  TypedData_Get_Struct(val, Map, &Map_type, self);
98
74
  self->map = map;
99
75
  self->arena = arena;
@@ -103,6 +79,7 @@ VALUE Map_GetRubyWrapper(upb_Map* map, upb_CType key_type, TypeInfo value_type,
103
79
  const upb_MessageDef* val_m = self->value_type_info.def.msgdef;
104
80
  self->value_type_class = Descriptor_DefToClass(val_m);
105
81
  }
82
+ return ObjectCache_TryAdd(map, val);
106
83
  }
107
84
 
108
85
  return val;
@@ -133,14 +110,13 @@ static upb_Map* Map_GetMutable(VALUE _self) {
133
110
  VALUE Map_CreateHash(const upb_Map* map, upb_CType key_type,
134
111
  TypeInfo val_info) {
135
112
  VALUE hash = rb_hash_new();
136
- size_t iter = kUpb_Map_Begin;
137
113
  TypeInfo key_info = TypeInfo_from_type(key_type);
138
114
 
139
115
  if (!map) return hash;
140
116
 
141
- while (upb_MapIterator_Next(map, &iter)) {
142
- upb_MessageValue key = upb_MapIterator_Key(map, iter);
143
- upb_MessageValue val = upb_MapIterator_Value(map, iter);
117
+ size_t iter = kUpb_Map_Begin;
118
+ upb_MessageValue key, val;
119
+ while (upb_Map_Next(map, &key, &val, &iter)) {
144
120
  VALUE key_val = Convert_UpbToRuby(key, key_info, Qnil);
145
121
  VALUE val_val = Scalar_CreateHash(val, val_info);
146
122
  rb_hash_aset(hash, key_val, val_val);
@@ -156,9 +132,8 @@ VALUE Map_deep_copy(VALUE obj) {
156
132
  upb_Map* new_map =
157
133
  upb_Map_New(arena, self->key_type, self->value_type_info.type);
158
134
  size_t iter = kUpb_Map_Begin;
159
- while (upb_MapIterator_Next(self->map, &iter)) {
160
- upb_MessageValue key = upb_MapIterator_Key(self->map, iter);
161
- upb_MessageValue val = upb_MapIterator_Value(self->map, iter);
135
+ upb_MessageValue key, val;
136
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
162
137
  upb_MessageValue val_copy =
163
138
  Msgval_DeepCopy(val, self->value_type_info, arena);
164
139
  upb_Map_Set(new_map, key, val_copy, arena);
@@ -202,9 +177,8 @@ void Map_Inspect(StringBuilder* b, const upb_Map* map, upb_CType key_type,
202
177
  StringBuilder_Printf(b, "{");
203
178
  if (map) {
204
179
  size_t iter = kUpb_Map_Begin;
205
- while (upb_MapIterator_Next(map, &iter)) {
206
- upb_MessageValue key = upb_MapIterator_Key(map, iter);
207
- upb_MessageValue val = upb_MapIterator_Value(map, iter);
180
+ upb_MessageValue key, val;
181
+ while (upb_Map_Next(map, &key, &val, &iter)) {
208
182
  if (first) {
209
183
  first = false;
210
184
  } else {
@@ -239,7 +213,6 @@ static VALUE Map_merge_into_self(VALUE _self, VALUE hashmap) {
239
213
  Map* other = ruby_to_Map(hashmap);
240
214
  upb_Arena* arena = Arena_get(self->arena);
241
215
  upb_Message* self_msg = Map_GetMutable(_self);
242
- size_t iter = kUpb_Map_Begin;
243
216
 
244
217
  Arena_fuse(other->arena, arena);
245
218
 
@@ -249,9 +222,9 @@ static VALUE Map_merge_into_self(VALUE _self, VALUE hashmap) {
249
222
  rb_raise(rb_eArgError, "Attempt to merge Map with mismatching types");
250
223
  }
251
224
 
252
- while (upb_MapIterator_Next(other->map, &iter)) {
253
- upb_MessageValue key = upb_MapIterator_Key(other->map, iter);
254
- upb_MessageValue val = upb_MapIterator_Value(other->map, iter);
225
+ size_t iter = kUpb_Map_Begin;
226
+ upb_MessageValue key, val;
227
+ while (upb_Map_Next(other->map, &key, &val, &iter)) {
255
228
  upb_Map_Set(self_msg, key, val, arena);
256
229
  }
257
230
  } else {
@@ -323,7 +296,9 @@ static VALUE Map_init(int argc, VALUE* argv, VALUE _self) {
323
296
 
324
297
  self->map = upb_Map_New(Arena_get(self->arena), self->key_type,
325
298
  self->value_type_info.type);
326
- ObjectCache_Add(self->map, _self);
299
+ VALUE stored = ObjectCache_TryAdd(self->map, _self);
300
+ (void)stored;
301
+ PBRUBY_ASSERT(stored == _self);
327
302
 
328
303
  if (init_arg != Qnil) {
329
304
  Map_merge_into_self(_self, init_arg);
@@ -343,10 +318,9 @@ static VALUE Map_init(int argc, VALUE* argv, VALUE _self) {
343
318
  static VALUE Map_each(VALUE _self) {
344
319
  Map* self = ruby_to_Map(_self);
345
320
  size_t iter = kUpb_Map_Begin;
321
+ upb_MessageValue key, val;
346
322
 
347
- while (upb_MapIterator_Next(self->map, &iter)) {
348
- upb_MessageValue key = upb_MapIterator_Key(self->map, iter);
349
- upb_MessageValue val = upb_MapIterator_Value(self->map, iter);
323
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
350
324
  VALUE key_val = Convert_UpbToRuby(key, Map_keyinfo(self), self->arena);
351
325
  VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
352
326
  rb_yield_values(2, key_val, val_val);
@@ -365,9 +339,9 @@ static VALUE Map_keys(VALUE _self) {
365
339
  Map* self = ruby_to_Map(_self);
366
340
  size_t iter = kUpb_Map_Begin;
367
341
  VALUE ret = rb_ary_new();
342
+ upb_MessageValue key, val;
368
343
 
369
- while (upb_MapIterator_Next(self->map, &iter)) {
370
- upb_MessageValue key = upb_MapIterator_Key(self->map, iter);
344
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
371
345
  VALUE key_val = Convert_UpbToRuby(key, Map_keyinfo(self), self->arena);
372
346
  rb_ary_push(ret, key_val);
373
347
  }
@@ -385,9 +359,9 @@ static VALUE Map_values(VALUE _self) {
385
359
  Map* self = ruby_to_Map(_self);
386
360
  size_t iter = kUpb_Map_Begin;
387
361
  VALUE ret = rb_ary_new();
362
+ upb_MessageValue key, val;
388
363
 
389
- while (upb_MapIterator_Next(self->map, &iter)) {
390
- upb_MessageValue val = upb_MapIterator_Value(self->map, iter);
364
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
391
365
  VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
392
366
  rb_ary_push(ret, val_val);
393
367
  }
@@ -464,24 +438,17 @@ static VALUE Map_has_key(VALUE _self, VALUE key) {
464
438
  */
465
439
  static VALUE Map_delete(VALUE _self, VALUE key) {
466
440
  Map* self = ruby_to_Map(_self);
441
+ rb_check_frozen(_self);
442
+
467
443
  upb_MessageValue key_upb =
468
444
  Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
469
445
  upb_MessageValue val_upb;
470
- VALUE ret;
471
-
472
- rb_check_frozen(_self);
473
446
 
474
- // TODO(haberman): make upb_Map_Delete() also capable of returning the deleted
475
- // value.
476
- if (upb_Map_Get(self->map, key_upb, &val_upb)) {
477
- ret = Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
447
+ if (upb_Map_Delete(self->map, key_upb, &val_upb)) {
448
+ return Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
478
449
  } else {
479
- ret = Qnil;
450
+ return Qnil;
480
451
  }
481
-
482
- upb_Map_Delete(Map_GetMutable(_self), key_upb);
483
-
484
- return ret;
485
452
  }
486
453
 
487
454
  /*
@@ -523,9 +490,8 @@ static VALUE Map_dup(VALUE _self) {
523
490
 
524
491
  Arena_fuse(self->arena, arena);
525
492
 
526
- while (upb_MapIterator_Next(self->map, &iter)) {
527
- upb_MessageValue key = upb_MapIterator_Key(self->map, iter);
528
- upb_MessageValue val = upb_MapIterator_Value(self->map, iter);
493
+ upb_MessageValue key, val;
494
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
529
495
  upb_Map_Set(new_map, key, val, arena);
530
496
  }
531
497
 
@@ -574,9 +540,8 @@ VALUE Map_eq(VALUE _self, VALUE _other) {
574
540
  // For each member of self, check that an equal member exists at the same key
575
541
  // in other.
576
542
  size_t iter = kUpb_Map_Begin;
577
- while (upb_MapIterator_Next(self->map, &iter)) {
578
- upb_MessageValue key = upb_MapIterator_Key(self->map, iter);
579
- upb_MessageValue val = upb_MapIterator_Value(self->map, iter);
543
+ upb_MessageValue key, val;
544
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
580
545
  upb_MessageValue other_val;
581
546
  if (!upb_Map_Get(other->map, key, &other_val)) {
582
547
  // Not present in other map.
@@ -607,6 +572,26 @@ static VALUE Map_freeze(VALUE _self) {
607
572
  return _self;
608
573
  }
609
574
 
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);
582
+ if (self->value_type_info.type == kUpb_CType_Message) {
583
+ size_t iter = kUpb_Map_Begin;
584
+ upb_MessageValue key, val;
585
+
586
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
587
+ VALUE val_val =
588
+ Convert_UpbToRuby(val, self->value_type_info, self->arena);
589
+ Message_internal_deep_freeze(val_val);
590
+ }
591
+ }
592
+ return _self;
593
+ }
594
+
610
595
  /*
611
596
  * call-seq:
612
597
  * Map.hash => hash_value
@@ -619,9 +604,8 @@ VALUE Map_hash(VALUE _self) {
619
604
 
620
605
  size_t iter = kUpb_Map_Begin;
621
606
  TypeInfo key_info = {self->key_type};
622
- while (upb_MapIterator_Next(self->map, &iter)) {
623
- upb_MessageValue key = upb_MapIterator_Key(self->map, iter);
624
- upb_MessageValue val = upb_MapIterator_Value(self->map, iter);
607
+ upb_MessageValue key, val;
608
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
625
609
  hash = Msgval_GetHash(key, key_info, hash);
626
610
  hash = Msgval_GetHash(val, self->value_type_info, hash);
627
611
  }
@@ -1,38 +1,13 @@
1
1
  // Protocol Buffers - Google's data interchange format
2
2
  // Copyright 2008 Google Inc. All rights reserved.
3
- // https://developers.google.com/protocol-buffers/
4
3
  //
5
- // Redistribution and use in source and binary forms, with or without
6
- // modification, are permitted provided that the following conditions are
7
- // met:
8
- //
9
- // * Redistributions of source code must retain the above copyright
10
- // notice, this list of conditions and the following disclaimer.
11
- // * Redistributions in binary form must reproduce the above
12
- // copyright notice, this list of conditions and the following disclaimer
13
- // in the documentation and/or other materials provided with the
14
- // distribution.
15
- // * Neither the name of Google Inc. nor the names of its
16
- // contributors may be used to endorse or promote products derived from
17
- // this software without specific prior written permission.
18
- //
19
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4
+ // Use of this source code is governed by a BSD-style
5
+ // license that can be found in the LICENSE file or at
6
+ // https://developers.google.com/open-source/licenses/bsd
30
7
 
31
8
  #ifndef RUBY_PROTOBUF_MAP_H_
32
9
  #define RUBY_PROTOBUF_MAP_H_
33
10
 
34
- #include <ruby/ruby.h>
35
-
36
11
  #include "protobuf.h"
37
12
  #include "ruby-upb.h"
38
13
 
@@ -63,4 +38,7 @@ extern VALUE cMap;
63
38
  // Call at startup to register all types in this module.
64
39
  void Map_register(VALUE module);
65
40
 
41
+ // Recursively freeze map
42
+ VALUE Map_internal_deep_freeze(VALUE _self);
43
+
66
44
  #endif // RUBY_PROTOBUF_MAP_H_