google-protobuf 3.19.1 → 3.25.1

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 (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 +121 -155
  4. data/ext/google/protobuf_c/convert.h +15 -37
  5. data/ext/google/protobuf_c/defs.c +362 -243
  6. data/ext/google/protobuf_c/defs.h +22 -47
  7. data/ext/google/protobuf_c/extconf.rb +13 -5
  8. data/ext/google/protobuf_c/glue.c +56 -0
  9. data/ext/google/protobuf_c/map.c +129 -137
  10. data/ext/google/protobuf_c/map.h +13 -36
  11. data/ext/google/protobuf_c/message.c +486 -389
  12. data/ext/google/protobuf_c/message.h +32 -47
  13. data/ext/google/protobuf_c/protobuf.c +101 -228
  14. data/ext/google/protobuf_c/protobuf.h +37 -42
  15. data/ext/google/protobuf_c/repeated_field.c +110 -113
  16. data/ext/google/protobuf_c/repeated_field.h +12 -34
  17. data/ext/google/protobuf_c/ruby-upb.c +12236 -6993
  18. data/ext/google/protobuf_c/ruby-upb.h +12127 -3787
  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 +22 -0
  24. data/ext/google/protobuf_c/third_party/utf8_range/naive.c +92 -0
  25. data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +157 -0
  26. data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +170 -0
  27. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +21 -0
  28. data/ext/google/protobuf_c/wrap_memcpy.c +7 -29
  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 +8 -1
  32. data/lib/google/protobuf/descriptor_pb.rb +43 -225
  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 +10 -28
  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 +18 -28
  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 +16 -40
  60. data/lib/google/protobuf/wrappers_pb.rb +24 -28
  61. data/lib/google/protobuf.rb +32 -50
  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 +82 -20
  66. data/tests/basic.rb +0 -640
  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"
@@ -34,7 +11,7 @@
34
11
  #include "protobuf.h"
35
12
 
36
13
  // -----------------------------------------------------------------------------
37
- // Basic map operations on top of upb_map.
14
+ // Basic map operations on top of upb_Map.
38
15
  //
39
16
  // Note that we roll our own `Map` container here because, as for
40
17
  // `RepeatedField`, we want a strongly-typed container. This is so that any user
@@ -48,8 +25,8 @@
48
25
  // -----------------------------------------------------------------------------
49
26
 
50
27
  typedef struct {
51
- const upb_map *map; // Can convert to mutable when non-frozen.
52
- upb_fieldtype_t key_type;
28
+ const upb_Map* map; // Can convert to mutable when non-frozen.
29
+ upb_CType key_type;
53
30
  TypeInfo value_type_info;
54
31
  VALUE value_type_class;
55
32
  VALUE arena;
@@ -62,9 +39,9 @@ static void Map_mark(void* _self) {
62
39
  }
63
40
 
64
41
  const rb_data_type_t Map_type = {
65
- "Google::Protobuf::Map",
66
- { Map_mark, RUBY_DEFAULT_FREE, NULL },
67
- .flags = RUBY_TYPED_FREE_IMMEDIATELY,
42
+ "Google::Protobuf::Map",
43
+ {Map_mark, RUBY_DEFAULT_FREE, NULL},
44
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
68
45
  };
69
46
 
70
47
  VALUE cMap;
@@ -84,8 +61,8 @@ static VALUE Map_alloc(VALUE klass) {
84
61
  return TypedData_Wrap_Struct(klass, &Map_type, self);
85
62
  }
86
63
 
87
- VALUE Map_GetRubyWrapper(upb_map* map, upb_fieldtype_t key_type,
88
- TypeInfo value_type, VALUE arena) {
64
+ VALUE Map_GetRubyWrapper(upb_Map* map, upb_CType key_type, TypeInfo value_type,
65
+ VALUE arena) {
89
66
  PBRUBY_ASSERT(map);
90
67
 
91
68
  VALUE val = ObjectCache_Get(map);
@@ -93,24 +70,24 @@ VALUE Map_GetRubyWrapper(upb_map* map, upb_fieldtype_t key_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;
100
76
  self->key_type = key_type;
101
77
  self->value_type_info = value_type;
102
- if (self->value_type_info.type == UPB_TYPE_MESSAGE) {
103
- const upb_msgdef *val_m = self->value_type_info.def.msgdef;
78
+ if (self->value_type_info.type == kUpb_CType_Message) {
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;
109
86
  }
110
87
 
111
- static VALUE Map_new_this_type(Map *from) {
88
+ static VALUE Map_new_this_type(Map* from) {
112
89
  VALUE arena_rb = Arena_new();
113
- upb_map* map = upb_map_new(Arena_get(arena_rb), from->key_type,
90
+ upb_Map* map = upb_Map_New(Arena_get(arena_rb), from->key_type,
114
91
  from->value_type_info.type);
115
92
  VALUE ret =
116
93
  Map_GetRubyWrapper(map, from->key_type, from->value_type_info, arena_rb);
@@ -125,22 +102,21 @@ static TypeInfo Map_keyinfo(Map* self) {
125
102
  return ret;
126
103
  }
127
104
 
128
- static upb_map *Map_GetMutable(VALUE _self) {
105
+ static upb_Map* Map_GetMutable(VALUE _self) {
129
106
  rb_check_frozen(_self);
130
- return (upb_map*)ruby_to_Map(_self)->map;
107
+ return (upb_Map*)ruby_to_Map(_self)->map;
131
108
  }
132
109
 
133
- VALUE Map_CreateHash(const upb_map* map, upb_fieldtype_t key_type,
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 = UPB_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_mapiter_next(map, &iter)) {
142
- upb_msgval key = upb_mapiter_key(map, iter);
143
- upb_msgval val = upb_mapiter_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);
@@ -152,25 +128,25 @@ VALUE Map_CreateHash(const upb_map* map, upb_fieldtype_t key_type,
152
128
  VALUE Map_deep_copy(VALUE obj) {
153
129
  Map* self = ruby_to_Map(obj);
154
130
  VALUE new_arena_rb = Arena_new();
155
- upb_arena *arena = Arena_get(new_arena_rb);
156
- upb_map* new_map =
157
- upb_map_new(arena, self->key_type, self->value_type_info.type);
158
- size_t iter = UPB_MAP_BEGIN;
159
- while (upb_mapiter_next(self->map, &iter)) {
160
- upb_msgval key = upb_mapiter_key(self->map, iter);
161
- upb_msgval val = upb_mapiter_value(self->map, iter);
162
- upb_msgval val_copy = Msgval_DeepCopy(val, self->value_type_info, arena);
163
- upb_map_set(new_map, key, val_copy, arena);
131
+ upb_Arena* arena = Arena_get(new_arena_rb);
132
+ upb_Map* new_map =
133
+ upb_Map_New(arena, self->key_type, self->value_type_info.type);
134
+ size_t iter = kUpb_Map_Begin;
135
+ upb_MessageValue key, val;
136
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
137
+ upb_MessageValue val_copy =
138
+ Msgval_DeepCopy(val, self->value_type_info, arena);
139
+ upb_Map_Set(new_map, key, val_copy, arena);
164
140
  }
165
141
 
166
142
  return Map_GetRubyWrapper(new_map, self->key_type, self->value_type_info,
167
143
  new_arena_rb);
168
144
  }
169
145
 
170
- const upb_map* Map_GetUpbMap(VALUE val, const upb_fielddef* field,
171
- upb_arena* arena) {
172
- const upb_fielddef* key_field = map_field_key(field);
173
- const upb_fielddef* value_field = map_field_value(field);
146
+ const upb_Map* Map_GetUpbMap(VALUE val, const upb_FieldDef* field,
147
+ upb_Arena* arena) {
148
+ const upb_FieldDef* key_field = map_field_key(field);
149
+ const upb_FieldDef* value_field = map_field_value(field);
174
150
  TypeInfo value_type_info = TypeInfo_get(value_field);
175
151
  Map* self;
176
152
 
@@ -180,7 +156,7 @@ const upb_map* Map_GetUpbMap(VALUE val, const upb_fielddef* field,
180
156
  }
181
157
 
182
158
  self = ruby_to_Map(val);
183
- if (self->key_type != upb_fielddef_type(key_field)) {
159
+ if (self->key_type != upb_FieldDef_CType(key_field)) {
184
160
  rb_raise(cTypeError, "Map key type does not match field's key type");
185
161
  }
186
162
  if (self->value_type_info.type != value_type_info.type) {
@@ -194,16 +170,15 @@ const upb_map* Map_GetUpbMap(VALUE val, const upb_fielddef* field,
194
170
  return self->map;
195
171
  }
196
172
 
197
- void Map_Inspect(StringBuilder* b, const upb_map* map, upb_fieldtype_t key_type,
173
+ void Map_Inspect(StringBuilder* b, const upb_Map* map, upb_CType key_type,
198
174
  TypeInfo val_type) {
199
175
  bool first = true;
200
176
  TypeInfo key_type_info = {key_type};
201
177
  StringBuilder_Printf(b, "{");
202
178
  if (map) {
203
- size_t iter = UPB_MAP_BEGIN;
204
- while (upb_mapiter_next(map, &iter)) {
205
- upb_msgval key = upb_mapiter_key(map, iter);
206
- upb_msgval val = upb_mapiter_value(map, iter);
179
+ size_t iter = kUpb_Map_Begin;
180
+ upb_MessageValue key, val;
181
+ while (upb_Map_Next(map, &key, &val, &iter)) {
207
182
  if (first) {
208
183
  first = false;
209
184
  } else {
@@ -219,10 +194,12 @@ void Map_Inspect(StringBuilder* b, const upb_map* map, upb_fieldtype_t key_type,
219
194
 
220
195
  static int merge_into_self_callback(VALUE key, VALUE val, VALUE _self) {
221
196
  Map* self = ruby_to_Map(_self);
222
- upb_arena *arena = Arena_get(self->arena);
223
- upb_msgval key_val = Convert_RubyToUpb(key, "", Map_keyinfo(self), arena);
224
- upb_msgval val_val = Convert_RubyToUpb(val, "", self->value_type_info, arena);
225
- upb_map_set(Map_GetMutable(_self), key_val, val_val, arena);
197
+ upb_Arena* arena = Arena_get(self->arena);
198
+ upb_MessageValue key_val =
199
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), arena);
200
+ upb_MessageValue val_val =
201
+ Convert_RubyToUpb(val, "", self->value_type_info, arena);
202
+ upb_Map_Set(Map_GetMutable(_self), key_val, val_val, arena);
226
203
  return ST_CONTINUE;
227
204
  }
228
205
 
@@ -234,9 +211,8 @@ static VALUE Map_merge_into_self(VALUE _self, VALUE hashmap) {
234
211
  RTYPEDDATA_TYPE(hashmap) == &Map_type) {
235
212
  Map* self = ruby_to_Map(_self);
236
213
  Map* other = ruby_to_Map(hashmap);
237
- upb_arena *arena = Arena_get(self->arena);
238
- upb_msg *self_msg = Map_GetMutable(_self);
239
- size_t iter = UPB_MAP_BEGIN;
214
+ upb_Arena* arena = Arena_get(self->arena);
215
+ upb_Message* self_msg = Map_GetMutable(_self);
240
216
 
241
217
  Arena_fuse(other->arena, arena);
242
218
 
@@ -246,10 +222,10 @@ static VALUE Map_merge_into_self(VALUE _self, VALUE hashmap) {
246
222
  rb_raise(rb_eArgError, "Attempt to merge Map with mismatching types");
247
223
  }
248
224
 
249
- while (upb_mapiter_next(other->map, &iter)) {
250
- upb_msgval key = upb_mapiter_key(other->map, iter);
251
- upb_msgval val = upb_mapiter_value(other->map, iter);
252
- upb_map_set(self_msg, key, val, arena);
225
+ size_t iter = kUpb_Map_Begin;
226
+ upb_MessageValue key, val;
227
+ while (upb_Map_Next(other->map, &key, &val, &iter)) {
228
+ upb_Map_Set(self_msg, key, val, arena);
253
229
  }
254
230
  } else {
255
231
  rb_raise(rb_eArgError, "Unknown type merging into Map");
@@ -305,22 +281,24 @@ static VALUE Map_init(int argc, VALUE* argv, VALUE _self) {
305
281
 
306
282
  // Check that the key type is an allowed type.
307
283
  switch (self->key_type) {
308
- case UPB_TYPE_INT32:
309
- case UPB_TYPE_INT64:
310
- case UPB_TYPE_UINT32:
311
- case UPB_TYPE_UINT64:
312
- case UPB_TYPE_BOOL:
313
- case UPB_TYPE_STRING:
314
- case UPB_TYPE_BYTES:
284
+ case kUpb_CType_Int32:
285
+ case kUpb_CType_Int64:
286
+ case kUpb_CType_UInt32:
287
+ case kUpb_CType_UInt64:
288
+ case kUpb_CType_Bool:
289
+ case kUpb_CType_String:
290
+ case kUpb_CType_Bytes:
315
291
  // These are OK.
316
292
  break;
317
293
  default:
318
294
  rb_raise(rb_eArgError, "Invalid key type for map.");
319
295
  }
320
296
 
321
- self->map = upb_map_new(Arena_get(self->arena), self->key_type,
297
+ self->map = upb_Map_New(Arena_get(self->arena), self->key_type,
322
298
  self->value_type_info.type);
323
- ObjectCache_Add(self->map, _self);
299
+ VALUE stored = ObjectCache_TryAdd(self->map, _self);
300
+ (void)stored;
301
+ PBRUBY_ASSERT(stored == _self);
324
302
 
325
303
  if (init_arg != Qnil) {
326
304
  Map_merge_into_self(_self, init_arg);
@@ -339,11 +317,10 @@ static VALUE Map_init(int argc, VALUE* argv, VALUE _self) {
339
317
  */
340
318
  static VALUE Map_each(VALUE _self) {
341
319
  Map* self = ruby_to_Map(_self);
342
- size_t iter = UPB_MAP_BEGIN;
320
+ size_t iter = kUpb_Map_Begin;
321
+ upb_MessageValue key, val;
343
322
 
344
- while (upb_mapiter_next(self->map, &iter)) {
345
- upb_msgval key = upb_mapiter_key(self->map, iter);
346
- upb_msgval val = upb_mapiter_value(self->map, iter);
323
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
347
324
  VALUE key_val = Convert_UpbToRuby(key, Map_keyinfo(self), self->arena);
348
325
  VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
349
326
  rb_yield_values(2, key_val, val_val);
@@ -360,11 +337,11 @@ static VALUE Map_each(VALUE _self) {
360
337
  */
361
338
  static VALUE Map_keys(VALUE _self) {
362
339
  Map* self = ruby_to_Map(_self);
363
- size_t iter = UPB_MAP_BEGIN;
340
+ size_t iter = kUpb_Map_Begin;
364
341
  VALUE ret = rb_ary_new();
342
+ upb_MessageValue key, val;
365
343
 
366
- while (upb_mapiter_next(self->map, &iter)) {
367
- upb_msgval key = upb_mapiter_key(self->map, iter);
344
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
368
345
  VALUE key_val = Convert_UpbToRuby(key, Map_keyinfo(self), self->arena);
369
346
  rb_ary_push(ret, key_val);
370
347
  }
@@ -380,11 +357,11 @@ static VALUE Map_keys(VALUE _self) {
380
357
  */
381
358
  static VALUE Map_values(VALUE _self) {
382
359
  Map* self = ruby_to_Map(_self);
383
- size_t iter = UPB_MAP_BEGIN;
360
+ size_t iter = kUpb_Map_Begin;
384
361
  VALUE ret = rb_ary_new();
362
+ upb_MessageValue key, val;
385
363
 
386
- while (upb_mapiter_next(self->map, &iter)) {
387
- upb_msgval val = upb_mapiter_value(self->map, iter);
364
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
388
365
  VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
389
366
  rb_ary_push(ret, val_val);
390
367
  }
@@ -401,10 +378,11 @@ static VALUE Map_values(VALUE _self) {
401
378
  */
402
379
  static VALUE Map_index(VALUE _self, VALUE key) {
403
380
  Map* self = ruby_to_Map(_self);
404
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
405
- upb_msgval val;
381
+ upb_MessageValue key_upb =
382
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
383
+ upb_MessageValue val;
406
384
 
407
- if (upb_map_get(self->map, key_upb, &val)) {
385
+ if (upb_Map_Get(self->map, key_upb, &val)) {
408
386
  return Convert_UpbToRuby(val, self->value_type_info, self->arena);
409
387
  } else {
410
388
  return Qnil;
@@ -421,11 +399,13 @@ static VALUE Map_index(VALUE _self, VALUE key) {
421
399
  */
422
400
  static VALUE Map_index_set(VALUE _self, VALUE key, VALUE val) {
423
401
  Map* self = ruby_to_Map(_self);
424
- upb_arena *arena = Arena_get(self->arena);
425
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
426
- upb_msgval val_upb = Convert_RubyToUpb(val, "", self->value_type_info, arena);
402
+ upb_Arena* arena = Arena_get(self->arena);
403
+ upb_MessageValue key_upb =
404
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
405
+ upb_MessageValue val_upb =
406
+ Convert_RubyToUpb(val, "", self->value_type_info, arena);
427
407
 
428
- upb_map_set(Map_GetMutable(_self), key_upb, val_upb, arena);
408
+ upb_Map_Set(Map_GetMutable(_self), key_upb, val_upb, arena);
429
409
 
430
410
  return val;
431
411
  }
@@ -439,9 +419,10 @@ static VALUE Map_index_set(VALUE _self, VALUE key, VALUE val) {
439
419
  */
440
420
  static VALUE Map_has_key(VALUE _self, VALUE key) {
441
421
  Map* self = ruby_to_Map(_self);
442
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
422
+ upb_MessageValue key_upb =
423
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
443
424
 
444
- if (upb_map_get(self->map, key_upb, NULL)) {
425
+ if (upb_Map_Get(self->map, key_upb, NULL)) {
445
426
  return Qtrue;
446
427
  } else {
447
428
  return Qfalse;
@@ -457,23 +438,17 @@ static VALUE Map_has_key(VALUE _self, VALUE key) {
457
438
  */
458
439
  static VALUE Map_delete(VALUE _self, VALUE key) {
459
440
  Map* self = ruby_to_Map(_self);
460
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
461
- upb_msgval val_upb;
462
- VALUE ret;
463
-
464
441
  rb_check_frozen(_self);
465
442
 
466
- // TODO(haberman): make upb_map_delete() also capable of returning the deleted
467
- // value.
468
- if (upb_map_get(self->map, key_upb, &val_upb)) {
469
- ret = Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
443
+ upb_MessageValue key_upb =
444
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
445
+ upb_MessageValue val_upb;
446
+
447
+ if (upb_Map_Delete(self->map, key_upb, &val_upb)) {
448
+ return Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
470
449
  } else {
471
- ret = Qnil;
450
+ return Qnil;
472
451
  }
473
-
474
- upb_map_delete(Map_GetMutable(_self), key_upb);
475
-
476
- return ret;
477
452
  }
478
453
 
479
454
  /*
@@ -483,7 +458,7 @@ static VALUE Map_delete(VALUE _self, VALUE key) {
483
458
  * Removes all entries from the map.
484
459
  */
485
460
  static VALUE Map_clear(VALUE _self) {
486
- upb_map_clear(Map_GetMutable(_self));
461
+ upb_Map_Clear(Map_GetMutable(_self));
487
462
  return Qnil;
488
463
  }
489
464
 
@@ -495,7 +470,7 @@ static VALUE Map_clear(VALUE _self) {
495
470
  */
496
471
  static VALUE Map_length(VALUE _self) {
497
472
  Map* self = ruby_to_Map(_self);
498
- return ULL2NUM(upb_map_size(self->map));
473
+ return ULL2NUM(upb_Map_Size(self->map));
499
474
  }
500
475
 
501
476
  /*
@@ -509,16 +484,15 @@ static VALUE Map_dup(VALUE _self) {
509
484
  Map* self = ruby_to_Map(_self);
510
485
  VALUE new_map_rb = Map_new_this_type(self);
511
486
  Map* new_self = ruby_to_Map(new_map_rb);
512
- size_t iter = UPB_MAP_BEGIN;
513
- upb_arena *arena = Arena_get(new_self->arena);
514
- upb_map *new_map = Map_GetMutable(new_map_rb);
487
+ size_t iter = kUpb_Map_Begin;
488
+ upb_Arena* arena = Arena_get(new_self->arena);
489
+ upb_Map* new_map = Map_GetMutable(new_map_rb);
515
490
 
516
491
  Arena_fuse(self->arena, arena);
517
492
 
518
- while (upb_mapiter_next(self->map, &iter)) {
519
- upb_msgval key = upb_mapiter_key(self->map, iter);
520
- upb_msgval val = upb_mapiter_value(self->map, iter);
521
- upb_map_set(new_map, key, val, arena);
493
+ upb_MessageValue key, val;
494
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
495
+ upb_Map_Set(new_map, key, val, arena);
522
496
  }
523
497
 
524
498
  return new_map_rb;
@@ -559,18 +533,17 @@ VALUE Map_eq(VALUE _self, VALUE _other) {
559
533
  self->value_type_class != other->value_type_class) {
560
534
  return Qfalse;
561
535
  }
562
- if (upb_map_size(self->map) != upb_map_size(other->map)) {
536
+ if (upb_Map_Size(self->map) != upb_Map_Size(other->map)) {
563
537
  return Qfalse;
564
538
  }
565
539
 
566
540
  // For each member of self, check that an equal member exists at the same key
567
541
  // in other.
568
- size_t iter = UPB_MAP_BEGIN;
569
- while (upb_mapiter_next(self->map, &iter)) {
570
- upb_msgval key = upb_mapiter_key(self->map, iter);
571
- upb_msgval val = upb_mapiter_value(self->map, iter);
572
- upb_msgval other_val;
573
- if (!upb_map_get(other->map, key, &other_val)) {
542
+ size_t iter = kUpb_Map_Begin;
543
+ upb_MessageValue key, val;
544
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
545
+ upb_MessageValue other_val;
546
+ if (!upb_Map_Get(other->map, key, &other_val)) {
574
547
  // Not present in other map.
575
548
  return Qfalse;
576
549
  }
@@ -599,6 +572,26 @@ static VALUE Map_freeze(VALUE _self) {
599
572
  return _self;
600
573
  }
601
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
+
602
595
  /*
603
596
  * call-seq:
604
597
  * Map.hash => hash_value
@@ -609,11 +602,10 @@ VALUE Map_hash(VALUE _self) {
609
602
  Map* self = ruby_to_Map(_self);
610
603
  uint64_t hash = 0;
611
604
 
612
- size_t iter = UPB_MAP_BEGIN;
605
+ size_t iter = kUpb_Map_Begin;
613
606
  TypeInfo key_info = {self->key_type};
614
- while (upb_mapiter_next(self->map, &iter)) {
615
- upb_msgval key = upb_mapiter_key(self->map, iter);
616
- upb_msgval val = upb_mapiter_value(self->map, iter);
607
+ upb_MessageValue key, val;
608
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
617
609
  hash = Msgval_GetHash(key, key_info, hash);
618
610
  hash = Msgval_GetHash(val, self->value_type_info, hash);
619
611
  }
@@ -1,59 +1,33 @@
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
 
39
14
  // Returns a Ruby wrapper object for the given map, which will be created if
40
15
  // one does not exist already.
41
- VALUE Map_GetRubyWrapper(upb_map *map, upb_fieldtype_t key_type,
42
- TypeInfo value_type, VALUE arena);
16
+ VALUE Map_GetRubyWrapper(upb_Map *map, upb_CType key_type, TypeInfo value_type,
17
+ VALUE arena);
43
18
 
44
- // Gets the underlying upb_map for this Ruby map object, which must have
19
+ // Gets the underlying upb_Map for this Ruby map object, which must have
45
20
  // key/value type that match |field|. If this is not a map or the type doesn't
46
21
  // match, raises an exception.
47
- const upb_map *Map_GetUpbMap(VALUE val, const upb_fielddef *field,
48
- upb_arena *arena);
22
+ const upb_Map *Map_GetUpbMap(VALUE val, const upb_FieldDef *field,
23
+ upb_Arena *arena);
49
24
 
50
25
  // Implements #inspect for this map by appending its contents to |b|.
51
- void Map_Inspect(StringBuilder *b, const upb_map *map, upb_fieldtype_t key_type,
26
+ void Map_Inspect(StringBuilder *b, const upb_Map *map, upb_CType key_type,
52
27
  TypeInfo val_type);
53
28
 
54
29
  // Returns a new Hash object containing the contents of this Map.
55
- VALUE Map_CreateHash(const upb_map* map, upb_fieldtype_t key_type,
56
- TypeInfo val_info);
30
+ VALUE Map_CreateHash(const upb_Map *map, upb_CType key_type, TypeInfo val_info);
57
31
 
58
32
  // Returns a deep copy of this Map object.
59
33
  VALUE Map_deep_copy(VALUE obj);
@@ -64,4 +38,7 @@ extern VALUE cMap;
64
38
  // Call at startup to register all types in this module.
65
39
  void Map_register(VALUE module);
66
40
 
41
+ // Recursively freeze map
42
+ VALUE Map_internal_deep_freeze(VALUE _self);
43
+
67
44
  #endif // RUBY_PROTOBUF_MAP_H_